Android Studio中如何实现按住ImageButton时改变背景色且不丢失图标
实现方案
你出现图标消失的问题,大概率是误将状态颜色资源设置到了android:src属性上覆盖了原图标,按以下方案修改即可,全程不需要改动android:src属性。
方法1:XML状态列表Drawable(最简便,无需逻辑代码)
- 第一步:在
res/drawable目录下新建call_button_bg.xml文件,写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按下状态的背景色 --> <item android:state_pressed="true" android:drawable="@color/pressed_color" /> <!-- 默认状态的背景色 --> <item android:drawable="@color/default_color" /> </selector>
在res/values/colors.xml中添加对应的颜色声明:
<color name="default_color">#1072E1</color> <color name="pressed_color">#0E63C4</color>
- 第二步:仅替换ImageButton的
android:background属性即可,其余属性保持不变:
<ImageButton android:id="@+id/call_button" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginStart="248dp" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:layout_marginBottom="8dp" android:background="@drawable/call_button_bg" android:contentDescription="@string/call" android:minWidth="48dp" android:src="@android:drawable/stat_sys_phone_call" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="@id/iv_image" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.466" />
如果需要兼容高版本的系统水波纹效果,可以在selector外层包裹ripple标签即可。
方法2:代码动态设置(适合需要动态修改交互规则的场景)
给按钮设置触摸监听,根据事件类型修改背景色,注意不要消费触摸事件避免影响原有的点击逻辑:
// Kotlin示例 call_button.setOnTouchListener { v, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { v.setBackgroundColor(Color.parseColor("#0E63C4")) false } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { v.setBackgroundColor(Color.parseColor("#1072E1")) false } else -> false } }
// Java示例 callButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: v.setBackgroundColor(Color.parseColor("#0E63C4")); return false; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: v.setBackgroundColor(Color.parseColor("#1072E1")); return false; default: return false; } } });
内容的提问来源于stack exchange,提问作者André_Almeida
相关产品推荐
相关产品推荐

