在ImageButton

时间:2016-02-19 05:47:09

标签: android android-fragments android-drawable android-imagebutton

我正在创建一个Android应用程序,它有大约15个ImageButtons。该应用程序将有一个活动和几个片段。某些按钮的onclick事件处理将由片段完成,其余部分将由活动完成。

我想在按下按钮时在按钮上应用色调。我不想在Normal和Pressed状态下使用不同的图像,但是想以编程方式应用色调,因为为每个按钮维护两个图像是一件很麻烦的事。

当我在Stackoverflow上搜索时,可以有多种方式。 1)处理onTouchEvent。在Action_Down事件上应用色调,并在Action_Up上取消色调效果。可以使用按钮上的setColorFilter应用色调。

View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: 
           ImageButton view = (ImageButton) v;
            view.setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
            v.invalidate();
            break;
        }
        case MotionEvent.ACTION_UP
            // Your action here on button click

        case MotionEvent.ACTION_CANCEL: {
                ImageButton view = (ImageButton) v;
                view.clearColorFilter();
                view.invalidate();
                break;
            }
        }
        return true;
    }
};

这种方法的问题在于,由于我处理按钮点击不同的地方(活动和片段),我必须在每个难以维护的地方进行此更改。另外,为了处理onClick操作,我在Action_Up事件中为每个按钮添加了一个switch语句。

2)使用Drawables,我为每个按钮创建drawable,在按钮的src中指定drawable文件。我写了一个像这样的可绘制文件。

<?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/btn_pressed_drawable" /><!-- pressed -->
<item android:state_focused="true"
    android:drawable="@drawable/button_image" /> <!-- focused -->
<item android:drawable="@drawable/button_image" /> <!-- default -->
</selector>

,btn_pressed_drawable的代码是

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/button_image"
    android:tint="#770000"/>

但这种方法的问题是我需要为每个按钮创建两个文件,我有大约15个按钮。

有一种简单的方法吗?我想把事情简单地放在一个地方。

我观察到的另一件事是,上述两种方法产生的结果是不同的。当我在每种情况下应用相同的色调值时,我看到不同的颜色。

1 个答案:

答案 0 :(得分:0)

您需要使用setColorFilter(..)编写colorfilter代码getBackground()。 之后,您的代码如下所示:

View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: 
           ImageButton view = (ImageButton) v;
            view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);//line changed
            v.invalidate();
            break;
        }
        case MotionEvent.ACTION_UP
            // Your action here on button click

        case MotionEvent.ACTION_CANCEL: {
                ImageButton view = (ImageButton) v;
                view.getBackground().clearColorFilter();//line changed
                view.invalidate();
                break;
            }
        }
        return true;
    }
};

我希望它对你有所帮助。