Как переместить текст кнопок при нажатии - PullRequest
18 голосов
/ 06 октября 2011

Я сделал собственный фон для кнопки, а также для разных состояний кнопок. Но теперь я дошел до того, что не могу понять.

Когда кнопка находится в нормальном состоянии, она выглядит просто отлично. Но когда я нажимаю кнопку, мне нужно сдвинуть текст на несколько пикселей вниз, потому что фоновое изображение кнопки движется (на самом деле такое ощущение, будто оно движется на изображении, потому что сначала под кнопкой есть рамка, а когда она находится в нажатом состоянии, эта граница исчезает). Пожалуйста, смотрите изображение ниже.

Как я могу перемещать текст кнопок в кнопке при нажатии кнопки? (может быть как-то отступы или макет для кнопки)

enter image description here

Ответы [ 5 ]

5 голосов
/ 01 августа 2012

Установка отступов в 9-patch не работала для меня.Установка отступов в сенсорных слушателях грязная, будет ли мусорить код везде, где используются кнопки.

Я пошел с подклассами Button, и это оказалось довольно аккуратно.В моем случае я хотел сместить значок (drawableLeft) и текст на 1 пиксель влево и на 1 пиксель вниз.

Виджет кнопки с подклассами:

package com.myapp.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

import com.myapp.R;

public class OffsetButton extends Button {

    public OffsetButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public OffsetButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public OffsetButton(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean value = super.onTouchEvent(event);

        if (event.getAction() == MotionEvent.ACTION_UP) {
            setBackgroundResource(R.drawable.btn_normal);
        } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
            setBackgroundResource(R.drawable.btn_pressed);
            setPadding(getPaddingLeft() + 1, getPaddingTop() + 1, getPaddingRight() - 1,
                    getPaddingBottom() - 1);
        }

        return value;
    }
}

И используйте его в макете следующим образом:

<com.myapp.widgets.OffsetButton
    android:text="@string/click_me"
    android:drawableLeft="@drawable/icon_will_be_offset_too_thats_good" />

Несколько заметок:

  • Я не не использовал StateListDrawable для фона, а вместо этого переключаю фон в коде.Когда я пытался использовать StateListDrawable, между сменой отступов и изменением фона возникала небольшая пауза.Это выглядело не очень хорошо.

  • Настройка фона сбрасывает отступы, поэтому не нужно настраивать отступ в ACTION_UP случае

  • Itбыло важно увеличить верхний и левый отступы, а одновременно уменьшить нижний и правый отступы.Таким образом, размер области содержимого остается неизменным, а область содержимого фактически просто смещается.

4 голосов
/ 06 октября 2011

Я не пробовал сам, но если вы используете патч с девятью в качестве фона для рисования для обоих состояний, вам следует рассмотреть возможность установки правильного поля отступа в рисованном состоянии. Подробнее здесь .

3 голосов
/ 06 октября 2011

Вы можете использовать отступы на виде.Вы можете добавить OnTouchListener к кнопке или просмотреть как

viewF.setOnTouchListener(new View.OnTouchListener() {  
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction == MotionEvent.ACTION_UP) { 
            //set your padding            
        } else if (event.getAction == MotionEvent.ACTION_DOWN){
            //set your padding            
        }   
        return true; 
    } 
}); 

Ontouchlistener сообщит вам, когда кнопка нажата, а не.

1 голос
/ 15 октября 2014

Ответ Петериса Кауна работает хуже, чем переопределение setPressed ().Но все в порядке с setPressed, пока вы не протестируете свое приложение на ICS или более низком устройстве и не добавите кнопку в качестве элемента списка.Для этого я улучшил класс моей кнопки:

public class OffsetButton extends Button {

    private static final int OFFSET_IN_DP = 6;
    private int offset_in_px;
    private boolean wasPressed = false;
    private Integer[] defaultPaddings;

    public OffsetButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView();
    }

    public OffsetButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public OffsetButton(Context context) {
        super(context);
        initView();
    }

    private void initView() {
        offset_in_px = (int) DisplayUtil.convertDpToPixel(OFFSET_IN_DP);
    }

    @Override
    public void setPressed(boolean pressed) {
        if (pressed && !wasPressed) {
            changePaddings();
        }
        if (!pressed && wasPressed) {
            resetPaddings();
        }
        super.setPressed(pressed);
    }

    private void changePaddings() {
        defaultPaddings = new Integer[]{getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom()};
        setPadding(getPaddingLeft(), getPaddingTop() + offset_in_px, getPaddingRight(), getPaddingBottom() - offset_in_px);
        wasPressed = true;
    }

    private void resetPaddings() {
        setPadding(defaultPaddings[0], defaultPaddings[1], defaultPaddings[2], defaultPaddings[3]);
        wasPressed = false;
    }

    @Override
    public boolean performClick() {
        resetPaddings();
        return super.performClick();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (isEnabled())
        {
            if (event.getAction() == MotionEvent.ACTION_DOWN && !wasPressed) {
                changePaddings();
            } else if (event.getAction() == MotionEvent.ACTION_UP && wasPressed) {
                resetPaddings();
            }
        }
        return super.onTouchEvent(event);
    }
}
0 голосов
/ 06 октября 2011

это может просто сработать:

setPadding(left, top, right, bottom); // Normal
setPadding(left, top + x, right, bottom - x); // Pressed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...