将一个图像用于不同的按钮状态

时间:2012-07-12 12:31:57

标签: android xml android-layout

我想创建带有图像的ImageButton,它有两种状态 - 正常和按下。状态使用相同的图像,但在按下状态下它更轻。是否可以仅使用XML,没有两个图像?

4 个答案:

答案 0 :(得分:2)

我找到了一个令我满意的解决方案:

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

在按钮背景上,我放置了这个drawable,其中来自资源的my_image图片和my_image_pressed下一个drawable:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <bitmap android:src="@drawable/my_image" />
    </item>
    <item>
        <color android:color="#5FEC" />
    </item>
</layer-list>

答案 1 :(得分:1)

但为什么你不想使用两个不同的图像?

答案 2 :(得分:1)

执行此操作:在名为selector.xml的可绘制文件夹中创建xml文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/lighter_image"
          android:state_pressed="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/original_image"/>

 </selector> 

在imageButton上将background设置为此xml:

android:background="@drawable/selector"

答案 3 :(得分:1)

按下状态时,可以在onDraw中将ColorFilter应用于ImageButton的图像。当它没有按下时清除它。

filter = new PorterDuffColorFilter(0x7FFFFFFF, PorterDuff.Mode.SRC_ATOP);

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    if (isPressed())
    {
        getDrawable().setColorFilter(filter);
    }
    else
    {
        getDrawable().clearColorFilter();
    }
}