Android 点击改变图片,松开变成原来图片

本文介绍如何在Android中使用XML选择器实现按钮不同状态下的图片切换,包括正常、聚焦和按下状态,通过设置drawable属性实现视觉反馈。

这个是放在drawable下的文件:

<?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/a" />
    <item android:state_focused="true" android:drawable="@drawable/a" />
    <item android:state_pressed="true" android:drawable="@drawable/b" />
</selector>

下面是怎么使用的:

  <Button
        android:id="@+id/mBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/image_btn_press"
        />
<think>我们正在处理一个Android开发问题:实现图片触摸时改变颜色的效果。根据用户需求,当触摸图片时,图片颜色应改变松开后恢复(或根据状态改变)。参考引用内容,有两种思路:1.使用Selector(状态列表)Drawable,类似引用[1]中改变按钮颜色的方式,但用于图片。不过,图片本身可能不是简单的颜色,而是图像,因此可能需要一种方式。2.自定义View,在触摸事件中改变绘制效果,如引用[2]中提到的自定义View和onDraw方法,但这里需要改变颜色而不是移动。实际上,对于图片改变颜色,常见做法是使用颜色滤镜(ColorFilter)。我们可以在触摸时给图片设置一个颜色滤镜(例如变暗或变色),在松开时清除滤镜。步骤:方法一:使用ImageView和Selector(仅适用于改变背景色或不同图片,不适用于直接改变图片颜色):我们可以准备两张图片:一张正常,一张高亮(或改变颜色后的图片),然后使用Selector作为ImageView的src或background。方法二:使用颜色滤镜(ColorFilter):在触摸事件中为ImageView设置ColorFilter,例如使用LightingColorFilter或PorterDuffColorFilter。方法三:自定义View,重写onTouchEvent和onDraw,在触摸时改变绘制的颜色。考虑到简单性和性能,方法二可能是最直接的。具体实现(方法二):1.在布局文件中放置一个ImageView。2.在代码中设置ImageView的触摸监听器,当触摸时(ACTION_DOWN)设置一个颜色滤镜,当触摸取消(ACTION_UP或ACTION_CANCEL)时清除滤镜。示例代码:在Activity或Fragment中:```javaImageViewimageView=findViewById(R.id.imageView);imageView.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN://设置颜色滤镜,例如变暗(使用Multiply模式,用灰色)//这里使用LightingColorFilter,第一个参数是颜色乘数,第二个是加上的颜色,这里我们让颜色变暗(乘数用0x7F7F7F,即半透明灰)//或者使用PorterDuffColorFilter,模式为SRC_ATOP,颜色为半透明v.getBackground().setColorFilter(0x7F7F7F7F,PorterDuff.Mode.MULTIPLY);//如果是src图片,则使用getDrawable()//注意:如果ImageView同时有背景和src,需要根据需求设置哪一个//这里假设我们改变的是背景,如果改变的是src,则使用v.getDrawable()//外,为了立即生效,需要调用invalidate()v.invalidate();break;caseMotionEvent.ACTION_UP:caseMotionEvent.ACTION_CANCEL://清除滤镜v.getBackground().clearColorFilter();v.invalidate();break;}returntrue;//返回true表示处理了触摸事件}});```但是,注意:如果ImageView的src和background都设置了,那么需要明确改变哪一个。外,上述代码改变的是背景。如果要改变src图片,则使用`v.getDrawable().setColorFilter(...)`。更常见的做法是改变src图片,因为通常图片是内容。所以调整如下:```javaimageView.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){Drawabledrawable=((ImageView)v).getDrawable();if(drawable==null){drawable=v.getBackground();//如果src没有,则尝试背景}if(drawable==null)returnfalse;switch(event.getAction()){caseMotionEvent.ACTION_DOWN://设置一个半透明的黑色滤镜,使图片变暗drawable.setColorFilter(0x80000000,PorterDuff.Mode.SRC_ATOP);v.invalidate();break;caseMotionEvent.ACTION_UP:caseMotionEvent.ACTION_CANCEL:drawable.clearColorFilter();v.invalidate();break;}returntrue;}});```注意:颜色值0x80000000是一个半透明的黑色(ARGB,A=128,R=0,G=0,B=0),使用SRC_ATOP模式将原图片与这个颜色混合,产生变暗效果。方法四:使用Selector和不同的图片(如果只有两种状态,且你有两张图片):在res/drawable中创建selector.xml:```xml<?xmlversion="1.0"encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@drawable/image_pressed"android:state_pressed="true"/><itemandroid:drawable="@drawable/image_normal"/></selector>```然后在ImageView中设置src为这个selector:```xml<ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/selector"/>```这种方法需要准备两张图片,但实现简单,无需代码。根据用户需求,如果图片颜色改变效果是简单的(比如只是变暗或变亮),那么使用颜色滤镜(方法二)更灵活,不需要额外图片资源。如果改变效果复杂(比如变成一种颜色),则可能需要准备两张图片,或者使用更高级的着色(tint)技术(API21以上可以使用android:tint属性,但不同状态可能需要StateListAnimator或StateListDrawable)。外,从AndroidAPI21开始,ImageView支持backgroundTint和tint属性,也可以结合Selector使用。但这里不展开。总结:推荐两种主要方式:1.使用Selector和两张图片(简单,但需要两张图片)2.使用代码设置颜色滤镜(灵活,只需一张图片,但需要写少量代码)用户可以根据需求选择。注意:如果使用颜色滤镜,在低版本Android上兼容性良好。相关问题:1.如何实现按钮触摸时改变背景颜色?2.在Android中如何给图片添加滤镜效果?3.如何使用Selector实现不同状态下的不同图片显示?4.自定义View中如何实现触摸反馈?</think>### Android 触摸图片改变颜色效果实现方式 在 Android 中实现图片触摸变色效果,主要有以下三种方法: #### 方法一:使用 Selector 状态选择器(推荐) 1. **创建状态选择器 XML** 在 `res/drawable` 创建 `image_color_selector.xml`: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 触摸状态时颜色 --> <item android:drawable="@drawable/image_pressed" android:state_pressed="true"/> <!-- 默认状态颜色 --> <item android:drawable="@drawable/image_normal"/> </selector> ``` 2. **设置 ImageView** 在布局文件中应用选择器: ```xml <ImageView android:id="@+id/my_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/image_color_selector" /> ``` #### 方法二:使用 ColorFilter 动态改变颜色 ```java ImageView imageView = findViewById(R.id.my_image); imageView.setOnTouchListener((v, event) -> { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 设置按下时的颜色滤镜(示例:蓝色滤镜) v.getDrawable().setColorFilter(0x800000ff, PorterDuff.Mode.SRC_ATOP); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // 清除颜色滤镜 v.getDrawable().clearColorFilter(); break; } return true; }); ``` #### 方法三:自定义 ImageView 1. **创建自定义类** ```java public class ColorChangeImageView extends AppCompatImageView { public ColorChangeImageView(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { setColorFilter(Color.argb(150, 0, 0, 255)); // 半透明白色 } else if (event.getAction() == MotionEvent.ACTION_UP) { clearColorFilter(); } return super.onTouchEvent(event); } } ``` 2. **在布局中使用** ```xml <com.example.app.ColorChangeImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/my_image" /> ``` ### 关键说明 1. **颜色效果调整**: - 使用 `ColorFilter` 时,可通过 `Color.argb(alpha, red, green, blue)` 调整颜色和透明度 - 滤镜模式建议使用 `PorterDuff.Mode.SRC_ATOP` 保持图片形状 2. **性能优化**: - 对于静态图片,Selector 方式性能最佳 - 动态图片建议使用 ColorFilter - 避免在 `onDraw()` 中频繁创建对象 3. **兼容性**: - Selector 方式兼容所有 Android 版本 - ColorFilter 在 API 1+ 可用 - 自定义 View 方式最灵活但稍复杂 > 参考实现:Android 状态选择器通过定义不同状态下的 drawable 实现视觉反馈[^1],ColorFilter 方案则通过代码动态修改图片着色[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值