How to move buttons text when state is pressed

后端 未结 5 813
挽巷
挽巷 2021-01-01 16:19

I made a custom background for a button and also for different button states. But now I made to a point that I cannot understand.

When button is in normal state the

5条回答
  •  太阳男子
    2021-01-01 16:44

    Setting padding in 9-patch didn't work for me. Setting padding in touch listeners is messy, would litter code anywhere buttons are used.

    I went with subclassing Button, and it turned out reasonably tidy. In my case, I wanted to offset icon (drawableLeft) and text 1px left and 1px down.

    Subclassed button widget:

    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;
        }
    }
    

    And use it in layout like this:

    
    

    Few notes:

    • I did not use StateListDrawable for background, and am instead switching backgrounds in code. When I tried using StateListDrawable, there would be small pause between padding change and background change. That didn't look good.

    • Setting background resets padding, so don't need to adjust padding in ACTION_UP case

    • It was important to increase top and left padding, and at the same time decrease bottom and right padding. So the size of content area stays the same and content area is effectively just shifted.

提交回复
热议问题