Android进阶——高级UI必知必会之2D绘画与Paint的基础应用(一)

文章大纲

引言

Paint、Canvas、Draw或许大家都不会陌生,虽然看来很简单,也知道各种API的用法和作用,但是是否有去深入了解过,是否知道Android上无论是控件还是图像都是由这三者协作完成的,很多人觉得自定义View很难,很大一部分原因就是对于相关UI绘制的知识不够熟悉,所以知其然更要知其所以然,授人以鱼不如授人以渔,下面的系列文章我争取把Android 2D绘画的一些相关知识点总结出来,相关文章链接如下:

一、Paint概述

Paint是虽然字面含义上是“画笔”的意思,代码角度上看Paint就是保存了文本和位图的样式和颜色信息的一个封装类(The Paint class holds the style and color information about how to draw geometries, text and bitmaps),指定了如何去绘制文本和图形的外观,Canvas负责决定图形的位置、形状;而Paint则决定了色彩和样式

二、Paint的基础应用

Paint在绘图过程中起到了极其重要的作用,Paint对象有很多设置方法,大体上可以分为两类:用于设置获取图形绘制、路径相关用于设置获取文字相关的

1、用于设置获取图形绘制、路径

1.1、setStyle(Paint.Style style)设置画笔的样式

Paint.Style.FILL ——填充内部
Paint.Style.FILL_AND_STROKE ——填充内部和描边
Paint.Style.STROKE——仅描边、

注意STROKE、FILL_OR_STROKE与FILL模式下外轮廓的位置会扩大

1.2、setStrokeWidth(float width设置笔刷的粗细度

当画笔样式为STROKE或FILL_OR_STROKE时才有效。

1.3、setAntiAlias(boolean aa)设置是否使用抗锯齿

设置使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。

1.4、setStrokeCap(Paint.Cap cap)设置笔刷的图形样式

  • Paint.Cap.ROUND——圆形线冒(圆形样式)
  • Paint.Cap.SQUARE——方形线冒(方形样式)
  • Paint.Cap.BUTT——无线冒)

当画笔样式为STROKE或FILL_OR_STROKE时才有效,冒多出来的那块区域就是线帽!就相当于给原来的直线加上一个帽子一样,所以叫线帽

1.5、setStrokeJoin(Paint.Join join) 设置线段连接处样式

  • Paint.Join.MITER——结合处为锐角
  • Paint.Join.Round——结合处为圆弧
  • Paint.Join.BEVEL——结合处为直线

1.6、setStrokeMiter(float miter) 设置笔画的倾斜度

90度拿画笔与30拿画笔,画出来的线条样式肯定是不一样的吧(不过好像效果不明显)。

1.7、void set(Paint src) 设置Paint画笔

1.8、setARGB(int a,int r,int g,int b)、setAlpha(int a) 、void setColor(int color) 设置绘制的颜色

对应的get方法获取与设置alpha值、颜色、ARGB等。

1.9、setDither(boolean dither)设定是否使用图像抖动处理

使用图像抖动处理绘制出来的图片颜色更加平滑和饱满,图像更加清晰。

1.10、setPathEffect(PathEffect effect)设置绘制路径的效果

  • CornerPathEffect——圆形拐角效果,比如paint.setPathEffect(new CornerPathEffect(100))利用半径R=50的圆来代替原来两条直线间的夹角。
  • DashPathEffect——虚线效果,比如paint.setPathEffect(new DashPathEffect(new float[]{20,10,50,100},15))画同一条虚线段,偏移值为15 。

intervals[]表示组成虚线的各个线段的长度,整条虚线就是由intervals[]中这些基本线段循环组成的。(如我们定义new float[] {20,10}时则这个虚线段就是由两段线段组成的,第一个可见的线段长为20,每二个线段不可见,长度为10);phase表示开始绘制的偏移值

1.11、setMaskFilter(MaskFilter maskfilter)设置MaskFilter滤镜

可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等。

1.12、setShader(Shader shader)设置图像渲染效果

使用Shader及其子类可以绘制出各种多彩的渲染效果。

1.13、setColorFilter(ColorFilter colorfilter)设置颜色过滤器

传递不同的ColorFilter 及其子类可以在绘制颜色时实现不用颜色的变换效果。

1.14、setShadowLayer(float radius ,float dx,float dy,int color)设置阴影效果

在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色

1.15、setXfermode(Xfermode xfermode)设置图形重叠时的处理方式

如合并,取交集或并集,经常用来制作橡皮的擦除效果

1.16、setFilterBitmap(boolean filter)

如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置

1.17、void reset()复位画笔

2、用于设置获取文字

2.1、float getFontSpacing() 获取字符行间距

很奇怪没有找到对应的set方法。

2.2、float getLetterSpacing() 和void setLetterSpacing(float letterSpacing)设置和获取字符间距

2.3、final boolean isUnderlineText() 和void setUnderlineText(boolean underlineText) 获取是否有下划线和设置下划线

2.4、final boolean isStrikeThruText() 和void setStrikeThruText(boolean strikeThruText)获取与设置是否有文本删除线

2.5、float getTextSize() 和void setTextSize(float textSize) 获取与设置文字大小

Paint.setTextSize传入的单位是px,而TextView.setTextSize传入的单位是sp,所以使用时不同分辨率处理问题

2.6、Typeface getTypeface()和Typeface setTypeface(Typeface typeface)获取与设置字体类型

Android默认有四种字体样式:BOLD(加粗)、BOLD_ITALIC(加粗并倾斜)、ITALIC(倾斜)、NORMAL(正常),我们也可以通过Typeface类来自定义个性化字体。

2.7、float getTextSkewX()和void setTextSkewX(float skewX) 获取与设置文字倾斜

参数没有具体范围,官方推荐值为-0.25,值为负则右倾,为正则左倾,默认值为0。

2.8、Paint.Align getTextAlign()和void setTextAlign(Paint.Align align) 获取与设置文本对齐方式

Paint.Align取值为CENTER、LEFT、RIGHT,也就是文字绘制是左边对齐、右边还是局中的。

2.9、setSubpixelText(boolean subpixelText)

固定的几个范围:320480,480800,7201280,10801920等,那么如何在同样的分辨率的显示器中增强显示清晰度呢?亚像素的概念就油然而生了(亚像素即把两个相邻的两个像素之间的距离再细分,再通过程序加入的一些像素,这些就是亚像素)。在两个像素间插入的像素个数是通过程序计算出来的,一般是插入两个、三个或四个。所以打开亚像素显示,是可以在增强文本显示清晰度的,将有助于文本增强在LCD屏幕上的显示效果,但由于插入亚像素是通过程序计算而来的,所以会耗费一定的计算机性能。

2.10、int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)

比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串的效果时。

2.11、setFakeBoldText(boolean fakeBoldText)设置粗体文字

模拟实现粗体文字,但设置在小字体上效果会非常差|

2.12、setTextAlign(Paint.Align align)设置绘制文字的对齐方向

2.13、setTextScaleX(float scaleX)设置绘制文字x轴的缩放比例

可以实现文字的拉伸的效果

三、Paint的高级应用

见下一篇文章。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 2022中高级android面试必知百题.pdf 是一份面向中高级 Android 开发岗位的面试必备题库。这份题库涵盖了Android开发的各个方面,包括Java基础Android框架、网络通信、数据存储、性能优化、设计模式等等。对于准备面试的开发者来说,掌握这些题目的答案是非常重要的。 在面对这份题库时,首先建议开发者系统地学习Android开发的基础知识和常用框架,了解Android的生命周期、四大组件、UI布局、事件处理等基本概念和技能。其次,重点关注题库中涉及的一些热门话题,例如Kotlin语言、Jetpack组件、Retrofit网络库、GreenDAO数据库等。此外,还应该学习一些面试常见的设计模式和算法题,这有助于提高自己在面试中的答题能力和应变能力。 对于每个题目,建议开发者认真思考,并提前编写一些简单的代码示例来验证自己的思路。在面试时,可以将这些代码示例作为参考,并结合自己的实际经验进行回答。此外,面试中的沟通能力也是非常重要的,要学会清晰地表达自己的想法,并与面试官积极互动,展示自己的学习能力和团队合作精神。 总之,通过认真学习和准备,对于2022中高级android面试必知百题.pdf中的问题做到心中有数,并能够自信地回答,将会给开发者在面试中带来更大的成功机会。 ### 回答2: 《2022中高级android面试必知百题.pdf》是一本面向中高级Android开发者的面试问题集合。该文档包含了一些常见的、涉及到Android开发领域的面试问题,旨在帮助面试者更好地准备面试。 该文档中的问题可以按照不同的主题进行分类,例如Android基础知识、Java编程、Android框架、网络通信、多线程编程、内存管理、性能优化、常见的设计模式等等。通过这些问题的答题,面试者可以进一步巩固自己的技术知识,提升解决问题的能力。 面试题的类型各不相同,有些问题是理论性的,需要候选者对基本概念和原则有清楚的了解。还有一些问题是针对实践经验和项目经验的,考察面试者在实际开发中的问题处理和解决能力。此外,还有一些题目是需要面试者进行编码实现,考察其编程能力和代码质量。 如何有效准备这些面试题是非常重要的。可以通过查阅相关书籍、博客和官方文档深入学习和理解,结合实际项目经验进行思考和实践,还可以参加一些线上或线下的技术交流活动,与其他开发者进行经验分享和学习。 总之,《2022中高级android面试必知百题.pdf》是一本面试前准备的良好参考资料,帮助面试者巩固知识、提升能力、在面试中更加从容自信地回答问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrazyMo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值