Android高级-Paint-滤镜,XFEMODE

 Paint 颜色相关

Pain的setShader设置着色器,最后一种混合模式中的ComposeShader ,构造方法中传入了

PorterDuff.Mode 
Xfermode 两个图层混合模式

我们先看PorterDuff.Mode

图层混合一般会使用三种方式:

第一:ComposeShader  构造方法中会设置图层混合规则

第二:Paint 的方法中有  mPaint.setXfermode() 方法  也需要设置图层混合规则

第三:ProterDuffColorFitter  颜色过滤器

看代码:

我们先看使用画笔设置图层混合模式

我们自己写一个自定义view  然后获取他的宽高,并初始化画笔。

使用图层混合之前要先静止硬件加速   图层混合在android14之后 ,有些api是不支持硬件加速的  而我们的系统是默认将硬件加速开启的。

我们从https://github.com/THEONE10211024/ApiDemos/blob/master/app/src/main/java/com/example/android/apis/graphics/Xfermodes.java

复制一个android 的源码:Xfermodes.java

并稍作修改,去掉各种继承,然后再绘制两个图 一个圆  一个方形  运行起来如下图

 关于这18种图形混合模式  我们按照源码来熟悉一下:

首先看代码我们知道

public SampleView(Context context) {
    super(context);
    mSrcB = makeSrc(W, H); //创建黄色的原型----底层
    mDstB = makeDst(W, H); //创建蓝色的正方形-----上层
//省略...

 然后我们来详细按照他的注释和绘制结果来看效果===

 

 

 

 从上图

 

源码中我们看到了图形混合操作  如下图

我们自己操作一下

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //禁止硬件加速
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    //调用
    setBackgroundColor(Color.GRAY);
    //离屏操作
    int  layerID=canvas.saveLayer(0,0,getWidth(),getHeight(),mPaint,Canvas.ALL_SAVE_FLAG);
    //目标图像=============
    canvas.drawBitmap(createRectBitmap(mWidth,mHeight), 0, 0, mPaint);
    //设置图层混合模式
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    //源图像
    canvas.drawBitmap(createCircleBitmap(mWidth,mHeight), 0, 0, mPaint);
    mPaint.setXfermode(null);

 canvas.restoreToCount(layerID);

}

//画矩形Dst
public Bitmap createRectBitmap(int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Paint dstPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    dstPaint.setColor(0xFF66AAFF);
    canvas.drawRect(new Rect(width / 20, height / 3, 2 * width / 3, 19 * height / 20), dstPaint);
    return bitmap;
}

//画圆src
public Bitmap createCircleBitmap(int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Paint scrPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    scrPaint.setColor(0xFFFFCC44);
    canvas.drawCircle(width * 2 / 3, height / 3, height / 4, scrPaint);
    return bitmap;
} 

运行后 

去掉离屏操作:

执行:

关于离屏设置:

添加离屏绘制,是先将矩形和圆合成一个图形,然后绘制到canvas中,再添加背景 setBackgroundColor(Color.GRAY);

而不添加离屏绘制,是将背景和矩形以及圆都绘制到canvas中。导致合成的图有灰色的背景。

也就是说离屏绘制是像图层一样,先后摆放绘制

DEMO:刮刮卡效果

初级版本

github地址:https://github.com/bbe-wang/ScratchCardDemo

      

中级版本一

代码中详细讲解==================》这是两个

 核心代码,

想要画一些东西,你需要4个基本的组件:

一个Bitmap来保存像素

一个Canvas用于承载绘制调用(比如drawLine等方法)

一个绘制源(比如:Rect,Path,text,Bitmap),

一个Paint(即画笔,用于描述绘制的颜色和样式)。

Canvas构造函数需要传入一个Bitmap,该bitmap是我们对canvas进行操作的载体,比如调用canvas的drawLine方法画一条线,将会把线画到bitmap里去。Canvas直接对该Bitmap对象进行修改,Bitmap保存我们的操作。

 

高级:

使用离屏方式设置实现刮刮乐

主要代码:

 

下面看Paint的效果相关

 

 代码实现:具体实现效果可以通过代码实现以下

 

 

 实现效果:

 

float[] colorMatrix = {
        1,0,0,0,0,   //red
        0,1,0,0,0,   //green
        0,0,1,0,0,   //blue
        0,0,0,1,0    //alpha
};

ColorMatrixColorFilter matrixColorFilter=new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(matrixColorFilter);
canvas.drawBitmap(mBitmap,0,0,mPaint);

运行结果:

这个数组运行下来的是图片的原图效果,我们来看一下是为什么,我们来了解一下颜色矩阵

 运行结果如下图所示:

修改颜色系数,有ColorFilter---  收集的颜色滤镜--多种:例如:胶片,怀旧,黑白,蓝调,光晕等等~

还有一个种修改颜色系数的方法----一调整亮度

 先上图,看效果

 这个也是原图效果,我们进入setScale去看看

还是操作颜色矩阵,然后修改颜色系数,达到修改颜色亮度的目的。

 

3:调整饱和度

下图分别为 setStaturation  为 0 ,1,2的效果图

                                                         

4:调整色度

cm.setRotate();

进入源码查看

我们设置一个旋转角度,内部还是操作颜色矩阵数组,我们看一下如何旋转角度实现色调变化

 我们可以这样理解,蓝色,绿色,红色,都在是一个时针,顺时针旋转多少度,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值