Paint.setColor(Color.BLUE);
setARGB(a, r, g, b)
setStrokeWidth() // 线宽
setAlpha() // 设置透明度
setAntiAlias() // 抗锯齿
setStyle() // 填充方式
Paint.Style.FILL :填充内部,会忽略任何和 stroke 相关的参数
Paint.Style.FILL_AND_STROKE :填充内部和描边
Paint.Style.STROKE :仅描边
paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影
Typeface是专门用来设置字体样式的,通过paint.setTypeface()来指定。可以指定系统中的字体样式,也可以指定自定义的样式文件中获取。要构建Typeface时,可以指定所用样式的正常体、斜体、粗体等,如果指定样式中,没有相关文字的样式就会用系统默认的样式来显示,一般默认是宋体。
Typeface font = Typeface.create(familyName,Typeface.NORMAL);
paint.setTypeface(font);
上面的各个参数都会用到Style变量,Style的枚举值如下:
AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。
PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
要应用转换模式,可以使用setXferMode方法,如下所示:
AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);
Porter-Duff 效果图:
PorterDuff.Mode 中不同 mode 算法中符号的意义为:
这所有的计算都以像素为单位,在某一种混合模式下,对每一个像素的alpha 和 color 通过对应算法进行运算,得出新的像素值,进行展示
int saveCount = canvas.saveLayer(0, 0, mTotalWidth, mTotalHeight, mPaint, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(mBottomBitmap, mBottomSrcRect, mBottomDestRect, mPaint);
mPaint.setXfermode(mPorterDuffXfermode);
canvas.drawBitmap(mTopBitmap, mTopSrcRect, mTopDestRect, mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(saveCount);
PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。清除模式[0,0],即最终所有点的像素的alpha 和color 都为 0,所以画出来的效果只有白色背景
PorterDuff.Mode.SRC
显示上层绘制图片。只保留源图像的 alpha 和 color ,所以绘制出来只有源图
PorterDuff.Mode.DST
显示下层绘制图片。同上类比,只保留目标图像的 alpha 和 color,所以绘制出来的只有目标图
PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖
PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示
PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。在两者相交的地方绘制源图像,并且绘制的效果会受到目标图像对应地方透明度的影响
PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。原理类比上面
PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。在不相交的地方绘制 源图像,效果受两者 alpha 值影响。(对于效果的疑问可以参考源码中对每个像素的计算公式)
PorterDuff.Mode.DST_OUT
取下层绘制非交集部分
PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分
PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分
PorterDuff.Mode.XOR
公式:[ Sa + Da - 2 * Sa * Da, Sc * ( 1 - Da ) + ( 1 - Sa ) * Dc ]
在不相交的地方按原样绘制源图像和目标图像,相交的地方受到对应alpha和色值影响,按上面公式进行计算,如果都完全不透明则相交处完全不绘制
PorterDuff.Mode.DARKEN
公式:[ Sa + Da - Sa * Da , Sc * ( 1 - Da ) + Dc * ( 1 - Sa ) + min(Sc , Dc) ]
该模式处理过后,会感觉效果变暗,即进行对应像素的比较,取较暗值,如果色值相同则进行混合;
从算法上看,alpha值变大,色值上如果都不透明则取较暗值,非完全不透明情况下使用上面算法进行计算,受到源图和目标图对应色值和alpha值影响
PorterDuff.Mode.LIGHTEN
公式:[ Sa + Da - Sa * Da , Sc * ( 1 -Da ) + Dc * ( 1 - Sa ) + max ( Sc , Dc ) ]
可以和 DARKEN 对比起来看,DARKEN 的目的是变暗,LIGHTEN 的目的则是变亮,如果在均完全不透明的情况下 ,色值取源色值和目标色值中的较大值,否则按上面算法进行计算
PorterDuff.Mode.MULTIPLY
正片叠底,即查看每个通道中的颜色信息,并将基色与混合色复合。结果色总是较暗的颜色。任何颜色与黑色复合产生黑色。任何颜色与白色复合保持不变。当用黑色或白色以外的颜色绘画时,绘画工具绘制的连续描边产生逐渐变暗的颜色。
PorterDuff.Mode.SCREEN
滤色,滤色模式与我们所用的显示屏原理相同,所以也有版本把它翻译成“屏幕”;
简单的说就是保留两个图层中较白的部分,较暗的部分被遮盖;
当一层使用了滤色(屏幕)模式时,图层中纯黑的部分变成完全透明,纯白部分完全不透明,其他的颜色根据颜色级别产生半透明的效果
注:
canvas原有的图片可以理解为背景,就是dst;新画上去的图片可以理解为前景,就是src。