【问题标题】:Custom Button Doesn't work with OnTouchListener自定义按钮不适用于 OnTouchListener
【发布时间】:2015-05-09 17:53:10
【问题描述】:

OnTouchListener 有问题。我创建了一个自定义按钮。此按钮可与 onClick 事件 一起正常工作。但它不适用于 onTouch 事件

这是我的自定义按钮。我只想要两个选项,只是 button 和 button_pressed。

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

这是我的 Ontouch 按钮代码。当我按住按钮时,音频正在播放和循环。当我释放按钮音频停止。此代码可以正常工作,但不适用于我的自定义按钮。因此,当我将手指放在此按钮上时,然后当我松开按钮或按住按钮时,在每种情况下,此按钮都只显示 button2.png(在自定义按钮代码上方)

pl6.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    int eventaction = event.getAction();
    switch (eventaction) {
        case MotionEvent.ACTION_DOWN: 

            n6=MediaPlayer.create(MainActivity.this, R.raw.audio4);
            n6.start();
            n6.setLooping(true);
        return true;

        case MotionEvent.ACTION_UP:   
       n6.stop();
       n6.release();

        break;
    }

    return false;

}


});

这是我的另一个按钮。这是正确的工作。此按钮是一个普通按钮,只需单击即可播放。 当我按下按钮时 button2_pressed 出现,当我未按下 button2 时出现。

play2.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
         stopPlaying2();    
    m2=MediaPlayer.create(MainActivity.this, R.raw.sound2);
    m2.start();



    }
});   

【问题讨论】:

  • 按下按钮后,它将成为焦点。我猜您的选择器中的第二项总是解析为 true,因此 button2_pressed 会一直显示。您可以尝试注释掉该特定项目以确认。
  • button2_pressed 不会出现在此事件中。只有button2出现。此自定义按钮代码与 onclick 事件一起使用。我在上面的文本中添加了我的其他代码。但它不适用于 onTouch 事件,自定义按钮代码可能会有所不同,但我不知道。

标签: android android-custom-view motionevent ontouch


【解决方案1】:

我自己又解决了我的问题。让我们解释一下; 首先,我克隆了所有按钮,例如 btnPlay1 和 btnPlay1c 但按钮 xml 彼此不同。区别仅在于 id 和自定义按钮 xml 文件。我使用了下面显示的 2 个自定义按钮 xml。

第一个自定义按钮mybutton1.xml

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

第二个自定义按钮mybutton1c.xml

<?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_pressed"
      android:state_focused="true" />
<item android:drawable="@drawable/button_pressed" />
</selector>

还有我的按钮示例。 克隆按钮不可见。 (btnPlay2c)

 <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" >

                <Button
                    android:id="@+id/btnPlay2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/mybutton1" />

                <Button
                    android:id="@+id/btnPlay2c"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/mybutton1c"
                    android:visibility="gone" />

            </FrameLayout>

最后,这是我的 java 文件。当我按下按钮时,显示按钮克隆,当我未按下正常按钮时显示。就是这样。

pl10.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
    int eventaction = event.getAction();
    switch (eventaction) {
        case MotionEvent.ACTION_DOWN: 

            n10=MediaPlayer.create(MainActivity.this, R.raw.audio7);
            n10.start();
            n10.setLooping(true);
           ///focus here\\              
            pl10c.setVisibility(View.VISIBLE);
            return true;

        case MotionEvent.ACTION_UP:   
       n10.stop();
       n10.release();
      //and here\\\        
     pl10c.setVisibility(View.INVISIBLE);
        break;
    }

    return false;

}


});

这个解决方案可能很累,但它解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2013-01-30
    • 2021-10-06
    • 2023-03-22
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多