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 :仅描边


  • 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 效果图:

参数及效果

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。


















版权声明:本文为chehec2010原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chehec2010/article/details/79682461

智能推荐

【Sublime】使用 Sublime 工具时运行python文件

使用 Sublime 工具时报Decode error - output not utf-8解决办法   在菜单中tools中第四项编译系统 内最后一项增添新的编译系统 自动新建 Python.sublime-build文件,并添加"encoding":"cp936"这一行,保存即可 使用python2 则注释encoding改为utf-8 ctr...

java乐观锁和悲观锁最底层的实现

1. CAS实现的乐观锁 CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的,也可以理解为自旋锁 JUC是指import java.util.concurrent下面的包, 比如:import java.util.concurrent.atomic.AtomicInteger; 最终实现是汇编指令:lock...

Python 中各种imread函数的区别与联系

  原博客:https://blog.csdn.net/renelian1572/article/details/78761278 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuc...

用栈判断一个字符串是否平衡

注: (1)本文定义:左符号:‘(’、‘[’、‘{’…… 右符号:‘)’、‘]’、‘}’……. (2)所谓的字符串的符号平衡,是指字符串中的左符号与右符号对应且相等,如字符串中的如‘(&r...

JAVA环境变量配置

位置 计算机->属性->高级系统设置->环境变量 方式一 用户变量新建path 系统变量新建classpath 方式二 系统变量 新建JAVA_HOME,值为JDK路径 编辑path,前加 方式三 用户变量新建JAVA_HOME 此路径含lib、bin、jre等文件夹。后运行tomcat,eclipse等需此变量,故最好设。 用户变量编辑Path,前加 系统可在任何路径识别jav...

猜你喜欢

常用的伪类选择器

CSS选择器众多 CSS选择器及权重计算 最常用的莫过于类选择器,其它的相对用的就不会那么多了,当然属性选择器和为类选择器用的也会比较多,这里我们就常用的伪类选择器来讲一讲。 什么是伪类选择器? CSS伪类是用来添加一些选择器的特殊效果。 常用的为类选择器 状态伪类 我们中最常见的为类选择器就是a标签(链接)上的为类选择器。 当我们使用它们的时候,需要遵循一定的顺序问题,否则将可能出现bug 注意...

ButterKnife的使用介绍及原理探究(六)

前面分析了ButterKnife的源码,了解其实现原理,那么就将原理运用于实践吧。 github地址:       点击打开链接 一、自定义注解 这里为了便于理解,只提供BindView注解。 二、添加注解处理器 添加ViewInjectProcessor注解处理器,看代码, 这里分别实现了init、getSupportedAnnotationTypes、g...

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。考试复习题库1|要求:只能使用单字符比较操作。

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。 要求只能使用单字符比较操作。 参考代码: 实验结果截图:...

小demo:slideDown()实现二级菜单栏下拉效果

效果如下,鼠标经过显示隐藏的二级菜单栏 但是这样的时候会存在一个问题,就是鼠标快速不停移入移出会导致二级菜单栏闪屏现象,一般需要使用stop()来清除事件  ...

基于docker环境的mysql主从复制

1、安装docker 可以参考之前的博客,之前写过了~ 2、拉取mysql镜像 3、创建mysql01和mysql02实例 主: 从: 4、进入容器修改配置 1)修改主数据库配置 进入主数据库容器 切换到 etc/mysql/目录下 查看可以看到my.cnf文件,使用vim编辑器打开,但是需要提前安装 安装vim命令: 安装成功后,修改my.cnf文件 新增配置后的my.cnf: binlog 日...