Paint 颜色相关
Pain的setShader设置着色器,最后一种混合模式中的ComposeShader ,构造方法中传入了
PorterDuff.Mode
Xfermode 两个图层混合模式
我们先看PorterDuff.Mode
图层混合一般会使用三种方式:
第一:ComposeShader 构造方法中会设置图层混合规则
第二:Paint 的方法中有 mPaint.setXfermode() 方法 也需要设置图层混合规则
第三:ProterDuffColorFitter 颜色过滤器
看代码:
我们先看使用画笔设置图层混合模式
我们自己写一个自定义view 然后获取他的宽高,并初始化画笔。
使用图层混合之前要先静止硬件加速 图层混合在android14之后 ,有些api是不支持硬件加速的 而我们的系统是默认将硬件加速开启的。
复制一个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();
进入源码查看
我们设置一个旋转角度,内部还是操作颜色矩阵数组,我们看一下如何旋转角度实现色调变化
我们可以这样理解,蓝色,绿色,红色,都在是一个时针,顺时针旋转多少度,