首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在按下状态时移动按钮文本

如何在按下状态时移动按钮文本
EN

Stack Overflow用户
提问于 2011-10-06 23:51:38
回答 4查看 3K关注 0票数 18

我为一个按钮和不同的按钮状态做了一个自定义背景。但现在我说到了一个我不能理解的地方。

当按钮处于正常状态时,它看起来很好。但当我按下按钮时,我需要将文本向下移动几个像素,因为按钮背景图像正在移动(实际上感觉像是它在图像上移动,因为首先在按钮下有边框,当它处于按下状态时,这个边框就会消失)。请看下面的图片。

当按钮状态被按下时,如何移动按钮中的按钮文本?(可能会以某种方式填充或自定义按钮的布局)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-07 00:00:02

我自己没有试过,但如果你使用九补丁作为两个状态的背景可绘制,那么你应该考虑在按下状态可绘制中设置适当的填充框。请参阅详细信息here

票数 4
EN

Stack Overflow用户

发布于 2011-10-07 00:22:21

您可以在视图上使用填充。您可以将OnTouchListener添加到按钮或视图,如下所示

代码语言:javascript
复制
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; 
    } 
}); 

当按钮被按下或没有被按下时,触摸式监听器会让你知道。

票数 3
EN

Stack Overflow用户

发布于 2014-10-15 14:58:32

比覆盖setPressed()更糟糕的是Pēteris Caune答案。但在你在ICS或更低版本的设备上测试你的应用程序并将按钮添加为列表视图项目之前,setPressed一切都没问题。为了实现这一点,我改进了按钮的类:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7676986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档