自定义View之Bitmap/在Bitmap上绘制新的图形/Xfermode属性

本文介绍了如何使用Matrix对Bitmap进行拉伸、平移、旋转和对称操作,并详细讲解了如何在Bitmap上创建新图形,以及运用PorterDuffXfermode的不同模式进行混合效果。通过对PorterDuff.Mode的16种枚举值的解析,展示了它们在图形绘制中的具体应用。

绘制Bitmap利用Matrix可以将Bitmap拉伸、平移、翻转、对称操作

1.首先是拉伸:需要调用Matrix.postScale()方法,第一个参数是沿x轴拉伸的倍数,第二个参数是沿y轴拉伸的倍数

2.平移:Matrix.postTranslate(),一个参数是沿x轴平移距离,第二个参数是沿y轴平移距离

3.旋转:Matrix.postRotate(),里面传入旋转角度

4.沿x轴对称,倒影效果: 首先是设置矩阵的值float matrix_values[]={1f,0f,0f,0f,-1f,0f,0f,0f,1f};然后Matrix.setValues(matrix_values);最后在绘制

5.沿y轴对称:首先是设置矩阵的值 float matrix_values[]={-1f,0f,0f,0f,1f,0f,0f,0f,1f};然后Matrix.setValues(matrix_values);最后在绘制

代码实现

public class BitmapView extends View {
   
   
    private int width;
    private int heigth;
    private Bitmap mBitmap;
    private Paint mPaint;
    private Matrix matrix;
    private int mBitmapWidth;
    private int mBitmapHeight;
    public BitmapView(Context context) {
        super(context);
    }

    public BitmapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mBitmap= BitmapFactory.decodeResource(getResources(), R.mipmap.wei);
        mPaint=new Paint();
        matrix=new Matrix();
        mBitmapWidth=mBitmap.getWidth();
        mBitmapHeight=mBitmap.getHeight();
    }
    @Override
    protected 
### 如何在自定义 View 中实现 Bitmap 的动态变色效果 在 Android 开发中,`Canvas` 和 `ColorFilter` 是用于实现位图(Bitmap)颜色变化的核心工具之一。以下是详细的说明: #### 使用 ColorMatrix 调整颜色 可以通过创建一个 `ColorMatrix` 对象来调整 RGBA 参数的颜色矩阵[^2]。这个矩阵是一个 4×5 的二维数组,能够控制红、绿、蓝以及透明度通道的变化。 下面是一段代码示例,展示如何利用 `ColorMatrix` 将一张彩色图片转换为灰度图像: ```java // 创建一个新的 ColorMatrix 并设置其参数以实现灰度化 ColorMatrix greyScaleMatrix = new ColorMatrix(new float[]{ 0.33f, 0.59f, 0.11f, 0, 0, 0.33f, 0.59f, 0.11f, 0, 0, 0.33f, 0.59f, 0.11f, 0, 0, 0, 0, 0, 1, 0}); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(greyScaleMatrix)); canvas.drawBitmap(originalBitmap, 0, 0, paint); ``` 上述代码中的 `ColorMatrix` 定义了一个线性组合,使得 RGB 值被平均分配到三个通道上,从而实现了灰度效果[^4]。 #### 动态修改颜色的方法 为了实现实时或动态的效果,可以将 `ColorMatrix` 的值绑定到用户的输入事件或者定时更新逻辑中。例如,在滑动条或其他交互组件的基础上实时更改颜色矩阵的系数并重新绘制视图。 以下是如何结合触摸事件动态改变颜色的一个简单例子: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 更新 ColorMatrix (假设有一个变量 controlValue 控制亮度) updateColorMatrix(controlValue); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); canvas.drawBitmap(bitmap, 0, 0, paint); } private void updateColorMatrix(float brightnessFactor) { colorMatrix.reset(); // 清除之前的变换 colorMatrix.setScale(brightnessFactor, brightnessFactor, brightnessFactor, 1); } ``` 在这个片段里,每当用户操作界面元素时都会触发 `updateColorMatrix()` 方法刷新当前使用的颜色矩阵,并调用 `invalidate()` 来通知系统重绘整个视图。 #### 设置背景颜色 如果还需要给自定义 View 添加特定背景颜色,则可以直接通过资源文件获取对应的颜色值并应用它[^3]: ```java setBackgroundColor(ContextCompat.getColor(context, R.color.your_custom_color)); ``` 以上就是基于 `Canvas` 和 `ColorFilter` 实现动态改变 Bitmap 颜色的主要方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值