Android - 自定义按钮卡住“按下”

时间:2011-05-16 19:32:28

标签: android button

我在Android应用中创建了一个自定义按钮,基本上有两种不同的视图。没有按下按钮的图像和按下按钮时使用的另一个图像。下面是我如何实现按钮以及它如何响应用户。

private void registerListeners() {

    calcButton.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            calcButton.requestFocusFromTouch();
            calcButton.setImageResource(R.drawable.calc_button_pressed);
            return false;
        }
    });

    calcButton.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            calcButton.setImageResource(R.drawable.calc_button_not_pressed);
        }
    });

    calcButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {           
            mathCalculation();
            calcButton.setImageResource(R.drawable.calc_button_not_pressed);
        }
    });
}

我的问题是存在一个“错误”,如果用户触摸按钮并将按钮拖离按钮,按钮保持按下状态。我在上面实现的一个解决方法是“setOnFocusChangeListener”,所以一旦用户选择了其它内容,它就会重新弹出。

我想拥有它,以便当用户拖动触摸按钮时,按钮弹出。

非常感谢所有建议!!!

谢谢,

4 个答案:

答案 0 :(得分:4)

您不需要编写单独的按钮类来获取该行为,您可以通过可绘制的xml实现它。在xml中有这个并将其设置为按钮的背景:

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

答案 1 :(得分:3)

在onTouch方法中,检查事件操作。

  • 如果是MotionEvent.ACTION_DOWN,则按原样继续。
  • 如果是ACTION_UP或ACTION_CANCEL,请致电calcButton.setImageResource(R.drawable.calc_button_not_pressed);

http://developer.android.com/reference/android/view/MotionEvent.html

答案 2 :(得分:1)

您可以使用onTouch。然后使用当用户触摸移出视图边界时触发的ACTION_OUTSIDE

编辑1:更具体:

OnTouchListener(MotionEvent e) {
   switch(e.getAction()) {
      case MotionEvent.ACTION_OUTSIDE: // switch the image if the button
    }
}

答案 3 :(得分:1)

这是因为点击事件仅在触摸和释放时“发生”。如果你正在触摸并向外移动而不是点击。

为了做你想做的事情,使用StateListDrawable,就是为此而做的。