4

我的 res/drawable 文件夹中有一个 button_animation.xml,用于显示不同的按钮状态(默认、按下、聚焦)。我在布局文件的按钮中引用了 button_animation.xml。它工作得很好,除了当我在实际按下的按钮上设置一个 onTouchListener 时。下面是我的代码。

button_animation.xml

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

布局.xml

     <Button
         android:id="@+id/button1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:background="@drawable/button_animation" />

导致动画中断的代码

Button button = (Button) findViewById(R.id.button1);
button.setOnTouchListener(this);

我是否无法按照文档的建议显示按钮状态并同时为任何特定视图处理 onClick?

文档:http: //developer.android.com/guide/topics/ui/controls/button.html

谢谢,

杰森

4

3 回答 3

8

这个答案已经很老了,但以防万一有人来搜索如何做到这一点,这就是你如何做到的。@Shadesblade 很接近,但不完全在那里。

public boolean onTouch(View button, MotionEvent theMotion) {

    switch (theMotion.getAction()) {

      case MotionEvent.ACTION_DOWN: 
          button.setPressed(true);
          break;
      case MotionEvent.ACTION_UP: 
          button.setPressed(false);
          break;
    }
    return true;
}

这样,您可以使用可绘制的 xml 选择器,并且仍然使用 ontouchlistener 切换状态。

还要确保视图“按钮”是可点击的(按钮类默认情况下是可点击的,但如果您使用的是其他视图/视图组,则需要在 xml 中删除它)。

于 2015-11-17T22:34:11.480 回答
2

只返回假。

public boolean onTouch(View view, MotionEvent event) {           
    if (event.getAction() == MotionEvent.ACTION_DOWN) {                

    } else if (event.getAction() == MotionEvent.ACTION_UP) {                

    }

    return false;
}
于 2014-12-18T11:42:36.040 回答
2

您应该使用 button.setOnClickListener(this) 而不是 button.setOnTouchListener(this),并且该类应该实现 OnClickListener。

如果你还需要处理onTouch(向下和向上),你可以自己处理背景设置。

public boolean onTouch( View button, MotionEvent theMotion ) {

   switch ( theMotion.getAction() ) {

      case MotionEvent.ACTION_DOWN: 
          //Set button background here
          break;
      case MotionEvent.ACTION_UP: 
          //set button to default background
          break;
   }
    return true;
}
于 2013-08-11T23:06:54.290 回答