0

我有 2 个不同父母的按钮。

我正在尝试在按钮的Touch 上应用按钮效果。

这是我的代码:

public class ButtonHighlighterOnTouchListener implements OnTouchListener {

    final Button button;

    public ButtonHighlighterOnTouchListener(final Button imageButton) {
      super();
      this.button = imageButton;
    }

    public boolean onTouch(final View view, final MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            button.getBackground().setColorFilter(Color.parseColor("#B7B2B0"), PorterDuff.Mode.MULTIPLY);
            button.invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            button.getBackground().clearColorFilter();
            button.invalidate();
            break;
        case MotionEvent.ACTION_UP:
            button.getBackground().clearColorFilter();
            button.invalidate();
            break;
        }
        return false;
        }
}

它将效果应用于按钮,但问题是因为我有 2 个按钮,即使我单击一个按钮,效果也会应用于另一个按钮。

请帮我解决这个问题。

4

3 回答 3

7

viewonTouch方法中,在您的情况下,Button正在单击。所以而不是

button.getBackground().setColorFilter(Color.parseColor("#B7B2B0"), PorterDuff.Mode.MULTIPLY);

利用

view.getBackground().setColorFilter(Color.parseColor("#B7B2B0"), PorterDuff.Mode.MULTIPLY);

在其他情况下切换也是如此。

编辑

相反,使用样式:

//background_button.xml in drawable folder
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
    //Here you can set style you want when Button is pressed
        <shape>
            <solid
                android:color="#22228C" />
            <stroke
                android:width="1dp"
                android:color="#9999DE" />
            <corners
                android:radius="7dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
    //Here you can set style you want when button is not pressed
        <shape>
            <gradient
                android:startColor="#5858C8"
                android:endColor="#22228C"
                android:angle="90" />
            <stroke
                android:width="1dp"
                android:color="#9999DE" />
            <corners
                android:radius="7dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>

//In your xml
<Button
     android:background="@drawable/background_button" ... />

编辑 2

Button有一个构造函数,您可以在其中告诉您要应用哪种样式。

public Button (Context context, AttributeSet attrs, int defStyle);

所以你可以设置defStyle = android.R.style.Button并在你的styles.xml添加

<style name="Button">
    <item name="android:background">@drawable/background_button</item>
</style>

有了它,我认为您可以使用样式初始化您Button的样式(您将在其中突出显示效果background_button.xml)并像现在一样添加背景图像。

于 2013-08-30T07:45:17.283 回答
4

尝试:用视图替换按钮返回true而不是false

public boolean onTouch(final View view, final MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            view .getBackground().setColorFilter(Color.parseColor("#B7B2B0"), PorterDuff.Mode.MULTIPLY);
            view .invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            view .getBackground().clearColorFilter();
            view .invalidate();
            break;
        case MotionEvent.ACTION_UP:
            view .getBackground().clearColorFilter();
            view .invalidate();
            break;
        }
        return true;
        }
于 2013-08-30T08:07:13.463 回答
0

我已经这样做了:

有两种方法可以在视图上应用颜色过滤器。

private ImageView imageView;

imageView = (ImageView) findViewById(R.id.imageView);

应用颜色过滤器

方式一:

imageView.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

或者

方式二:

imageView.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);

清除彩色滤光片

imageView.clearColorFilter();

两者对我来说都很好。

希望这会对你有所帮助。

于 2016-07-15T09:26:08.927 回答