Android2D绘图四

Paint 常用属性

  • setColor()
Paint.setColor(Color.BLUE);
  • 1
  • setARGB(a, r, g, b)

  • setStrokeWidth() // 线宽

  • setAlpha() // 设置透明度

  • setAntiAlias() // 抗锯齿

  • setStyle() // 填充方式

    Paint.Style.FILL :填充内部,会忽略任何和 stroke 相关的参数
    Paint.Style.FILL_AND_STROKE :填充内部和描边
    Paint.Style.STROKE :仅描边


Android2D绘图四_第1张图片

  • setShadowLayer (float radius, float dx, float dy, int color) 添加阴影
paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影

文字相关

  • paint.setTextAlign(Align.CENTER)
    设置文字对齐方式,取值:align.CENTER、align.LEFT或align.RIGHT
  • paint.setTextSize(12)
    设置文字大小
  • paint.setFakeBoldText(true)
    设置是否为粗体文字
  • paint.setUnderlineText(true)
    设置下划线
  • paint.setTextSkewX((float) -0.25)
    设置字体水平倾斜度,普通斜体字是-0.25
  • paint.setStrikeThruText(true)
    设置带有删除线效果
  • paint.setTextScaleX(2)
    只会将水平方向拉伸,高度不会变

字体相关

Typeface是专门用来设置字体样式的,通过paint.setTypeface()来指定。可以指定系统中的字体样式,也可以指定自定义的样式文件中获取。要构建Typeface时,可以指定所用样式的正常体、斜体、粗体等,如果指定样式中,没有相关文字的样式就会用系统默认的样式来显示,一般默认是宋体。

Typeface font = Typeface.create(familyName,Typeface.NORMAL);  
paint.setTypeface(font); 
  • 1
  • 2
  • Typeface create(String familyName, int style)
    直接通过指定字体名来加载系统中自带的文字样式
  • Typeface create(Typeface family, int style)
    通过其它Typeface变量来构建文字样式
  • Typeface createFromAsset(AssetManager mgr, String path)
    通过从Asset中获取外部字体来显示字体样式
  • Typeface createFromFile(String path)
    直接从路径创建
  • Typeface createFromFile(File path)
    从外部路径来创建字体样式
  • Typeface defaultFromStyle(int style)
    创建默认字体

上面的各个参数都会用到Style变量,Style的枚举值如下:

  • Typeface.NORMAL //正常体
  • Typeface.BOLD //粗体
  • Typeface.ITALIC //斜体
  • Typeface.BOLD_ITALIC //粗斜体

Xfermode

AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。

PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

要应用转换模式,可以使用setXferMode方法,如下所示:

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);
  • 1

Porter-Duff 效果图:

Android2D绘图四_第2张图片

参数及效果

PorterDuff.Mode 中不同 mode 算法中符号的意义为:

  • Sa 代表source alpha ,即源 alpha 值
  • Da 代表 Destination alpha ,即 目标alpha值
  • Sc 代表 source color ,即源色值
  • Dc 代表 Destination color ,即目标色值

这所有的计算都以像素为单位,在某一种混合模式下,对每一个像素的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。


















你可能感兴趣的:(【android】)