触摸按钮但指针不在按钮外时如何设置填充?

How set Padding when an button is touched but the pointer is out of my button?

我使用 XML 文件来显示具有 2 种状态(正常、按下)的按钮。我怎么能够 找出何时触摸按钮但光标不在?

我想要这样的按钮效果

按钮not触摸

按钮touched

按钮被触摸但是finger hasn't been lifted

这是我使用的 XML 文件:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/button_press" />
    <item android:drawable="@drawable/button_nopress" />
</selector>

这是我的 Java class:

button = findViewById(R.id.b1);
button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN){
                    button.setPadding(0, 55, 0, 0);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    button.setPadding(0, 0, 0, 0);
                }
                return false;
            }
        });            

这是我的按钮和我的代码:

按钮被触摸但是finger hasn't been lifted

看下面的代码。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_focused"
          android:state_focused="true" />
    <item android:drawable="@drawable/button_default" />
</selector>

属性 state_pressed 或 state_focused 应该可以完成这项工作。 请参阅以下 link 以获得更多指导

更新

我可以用这个代码来做:

private Rect rect;    // Variable rect to hold the bounds of the view
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        // Construct a rect of the view's bounds
        rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
    }
    if(event.getAction() == MotionEvent.ACTION_MOVE){
        if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
            // User moved outside bounds
        }
    }
    return false;
}