Android改变图片颜色的自定义控件

效果如下:

理解:Xfermode的16总模式如图

第一步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.rong.activity;
 
import com.rong.test.R;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
/**
 * 改变图片颜色的自定义View
 * @author 徐荣
 *
 */
public class ChangeImageColorView extends View {
    Paint mPaint;
    PorterDuffXfermode xfermode;
    Bitmap bitmap;
    int mBitWidth;
    int mBitHeight;
    int width;
    int height;
    Rect srcRect;
    Rect dstRect;
    RectF mRect;
    int i=0;
 
    public ChangeImageColorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }
 
    private void initView() {
        // 初始化画笔
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.BLUE);
        // 设置Xfermode
        xfermode = new PorterDuffXfermode(Mode.SRC_IN);
        // 获取图片源
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.robot);
        mBitWidth = bitmap.getWidth();
        mBitHeight = bitmap.getHeight();
         
    }
 
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //获取控件的宽高
        width = w;
        height = h;
        srcRect = new Rect(00, width, height);
        dstRect = new Rect(00, width, height);
        mRect = new RectF(00, width, height);
        i=width;
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //相当于PS的新建图层
        int num = canvas.saveLayer(00, width, height, mPaint, Canvas.ALL_SAVE_FLAG);
        //绘制图片
        canvas.drawBitmap(bitmap, srcRect, dstRect, mPaint);
        //设置图片混合模式
        mPaint.setXfermode(xfermode);
        //绘制动态区域
        canvas.drawRect(mRect, mPaint);
        //恢复混合模式
        mPaint.setXfermode(null);
        //合并图层
        canvas.restoreToCount(num);
        //更改区域的位置
        i = i - 1;
        mRect.top = i;
        if (i == 0) {
            i = width;
        }
        //刷新UI,他会调用onDraw方法
        invalidate();
    }
 
}

 

第二步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_touchlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >
 
    <com.rong.activity.ChangeImageColorView
        android:id="@+id/main_percentview"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true" />
 
</RelativeLayout>
posted @   brave-sailor  阅读(442)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2015-12-20 IOS(swift)-数据存储 · 用NSUserDefaults存储配置信息
2013-12-20 详细解析Java中抽象类和接口的区别
点击右上角即可分享
微信分享提示