如何使自定义背景图片的Android按钮在被点击后显示为按下状态(例如向下或发生变化)。 我不想像Google Hello Views示例中所示那样包含更多图像并将不同的图像设置为不同的状态。 谢谢。
如何使自定义背景图片的Android按钮在被点击后显示为按下状态(例如向下或发生变化)。 我不想像Google Hello Views示例中所示那样包含更多图像并将不同的图像设置为不同的状态。 谢谢。
你需要使用两个图像来完成此操作。
然后在drawable文件夹中创建一个XML资源。
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false"
android:drawable="@drawable/button_normal" />
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" />
</selector>
然后,将此文件设置为ImageView的背景。这里我们使用ImageView作为按钮。别忘了将这两个按钮包含在drawable文件夹中。就这样。
使用ColorFilter方法可以只使用一个图像文件完成。但是,ColorFilter希望与ImageViews一起使用而不是Buttons,因此您必须将按钮转换为ImageViews。如果您已经使用图像作为按钮,则这不是问题,但如果您有文本,则更加烦人...无论如何,假设您找到了解决文本问题的方法,这里是要使用的代码:
ImageView button = (ImageView) findViewById(R.id.button);
button.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
这会在按钮上应用一个红色的覆盖层(颜色代码是完全不透明的红色十六进制代码 - 前两位是透明度,接着是RR GG BB)。
您可以通过从sdkfolder/platforms/(android version/data/res/drawable复制btn_default_normal.9.png文件到您自己的项目中,使您的ImageView看起来像普通按钮。然后,在您的ImageView中使用android:background="@drawable/btn_normal_default"
和android:src="..."
来设置按钮内部的图像。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image">
</item>
<item android:drawable="@drawable/transparent_image">
</item>
</layer-list>
</item>
<item android:drawable="@drawable/image"></item>
</selector>
我想再添加另一种简单的方法来实现这个: 如果你的ImageButton保留了它的背景,并且你没有将其设置为null,它将像普通按钮一样工作,并在点击时显示点击动画,就像其他按钮一样。隐藏背景的方法:
<ImageButton
android:id="@+id/imageButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="1dp"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:paddingTop="1dp"
android:src="@drawable/squareicon" />
填充不会让背景可见,并使按钮像其他按钮一样工作。
如果你想要默认的按钮点击效果,你可以将背景可绘制对象放在一个“涟漪”(ripple)中,如下所示。
这个例子将产生一个带有边框、透明背景和默认按钮点击动画的按钮,就像这样:
创建res/drawable/image_btn_border.xml
。<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item android:id="@android:id/mask">
<inset
android:insetLeft="@dimen/image_btn_insert"
android:insetTop="@dimen/image_btn_insert"
android:insetRight="@dimen/image_btn_insert"
android:insetBottom="@dimen/image_btn_insert">
<shape android:shape="rectangle">
<solid android:color="@android:color/background_light" />
<corners android:radius="@dimen/image_btn_corner_radius" />
</shape>
</inset>
</item>
<item>
<inset
android:insetLeft="@dimen/image_btn_insert"
android:insetTop="@dimen/image_btn_insert"
android:insetRight="@dimen/image_btn_insert"
android:insetBottom="@dimen/image_btn_insert">
<shape android:shape="rectangle">
<stroke
android:color="?attr/colorButtonNormal"
android:width="1dp"/>
<corners android:radius="@dimen/image_btn_corner_radius" />
</shape>
</inset>
</item>
</ripple>
添加到res/values/dimens.xml
<resources>
<dimen name="image_btn_corner_radius">4dp</dimen>
<dimen name="image_btn_insert">5dp</dimen>
</resources>
<ImageButton
android:id="@+id/imageButton"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/image_btn_border"
android:contentDescription="@string/action_add_photo"
app:srcCompat="@android:drawable/ic_menu_camera" />
细节
android:id="@android:id/mask"
的item
被ripple
用于在按钮被按下时从@android:color/background_light
过渡到?attr/colorControlHighlight
。item
是我们想要的按钮正常(未按下)状态的实际背景。android:inset*
设置背景边距。