Surface从SurfaceFlinger通过dequeueBuffer申请buffer,新建了一个SkBitmap,再用这个Bitmap对象构造一个native的Canvas对象(SKCanvas)。
ViewRootImpl会创建Canvas持有SKCanvas,这个Canvas就是我们可以操作的Canvas。
Canvas常见操作
二阶贝塞尔绘制API:
public void quadTo(float x1, float y1, float x2, float y2)
public void rQuadTo(float dx1, float dy1, float dx2, float dy2)
三阶贝塞尔绘制API:
public void quadTo(float x1, float y1, float x2, float y2, float x3, float y3)
public void rQuadTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3)
Text注意,includpadding为true时view的高度是top与bottom之间的间距,而设置为false之后,view的高度是ascent与descent之间的间距
SpannableString
SpannableString其实和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。
setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,what
表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,start
表示需要设置格式的子字符串的起始下标,同理end
表示终了下标,flags
属性就有意思了,共有四种属性:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
从起始下标到终了下标,包括起始下标 Spanned.SPAN_INCLUSIVE_INCLUSIVE
从起始下标到终了下标,同时包括起始下标和终了下标 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
从起始下标到终了下标,但都不包括起始下标和终了下标 Spanned.SPAN_EXCLUSIVE_INCLUSIVE
从起始下标到终了下标,包括终了下标
ForegroundColorSpan
为文本设置前景色,效果和TextView的setTextColor()类似
BackgroundColorSpan
为文本设置背景色,效果和TextView的setBackground()类
RelativeSizeSpan
设置文字相对大小,在TextView原有的文字大小的基础上,相对设置文字大小
TypefaceSpan
控制字体
StrikethroughSpan
为文本设置中划线,也就是常说的删除线
UnderlineSpan
为文本设置下划线
SuperscriptSpan
设置上标
SubscriptSpan
设置下标
StyleSpan
为文字设置风格(粗体、斜体)
ImageSpan
设置文本图片
ClickableSpan
设置可点击的文本,设置这个属性的文本可以相应用户点击事件
URLSpan
设置超链接文本,其实聪明的小伙帮在讲到ClickableSpan
的时候就能实现超链接文本的效果了
SpannableStringBuilder
实现对,SpannableString的一个拼接效果,同样是append()方法
Bitmap
即位图。它本质上就是一张图片的内容在内存中的表达形式
ARGB_8888:四个通道都是8位,每个像素占用4个字节,图片质量是最高的,但是占用的内存也是最大的;
ARGB_4444:四个通道都是4位,每个像素占用2个字节,图片的失真比较严重;
RGB_565:没有A通道,每个像素占用2个字节,图片失真小,但是没有透明度;
ALPHA_8:只有A通道,每个像素占用1个字节大大小,只有透明度,没有颜色值。
使用场景总结:ARGB_4444失真严重,基本不用;ALPHA_8使用场景特殊,比如设置遮盖效果等;不需要设置透明度,RGB_565是个不错的选择;既要设置透明度,对图片质量要求又高,就用ARGB_8888。
BitmapFactory.decodeFile,BitmapFactory.decodeStream 从文件中读取
BitmapFactory.decodeByteArray 从字节序列中读取
BitmapFactory.decodeResource 从资源中读取
BitmapRegionDecoder 以按照区域进行加载
Drawable
专门用于处理背景的抽象概念,View的draw方法中调用传递的drawable的draw方法画出背景。
AdaptiveIconDrawable自适应图标,API26提出,分为前景与背景
AnimatedVectorDrawableAPI21提出,使用ObjectAnimator或AnimatorSet定义的动画来动画VectorDrawable的属性。
BitmapDrawable 一个可绘制的位图,可以平铺,拉伸或对齐。
ColorDrawable专门的Drawable,用指定的颜色填充Canvas。
DrawableContainer包含多个Drawable并选择使用哪个的助手类.
AnimationDrawable用于创建逐帧动画的对象,由一系列Drawable对象定义,可用作View对象的背景。
LevelListDrawable级别列表,定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量
StateListDrawable状态列表,此 XML 文件为不同状态引用不同位图图形
AnimatedStateListDrawableAPI21,Drawable包含一组可绘制的关键帧,其中当前显示的关键帧是基于当前状态集来选择的
DrawableWrapper只有一个子元素的可绘制容器。API23
ClipDrawable根据Drawable的当前级别值剪切另一个Drawable的一个Drawable。
InsetDrawable将另一个Drawable插入距离边界的距离的一个Drawable。
RotateDrawable可以根据当前级别的值旋转另一个Drawable的Drawable
ScaleDrawable根据当前级别值更改另一个Drawable的大小的Drawable。
GradientDrawable带按钮,背景等颜色渐变的Drawable
LayerDrawable管理一系列其他Drawable的Drawable。
RippleDrawable可绘制的,显示响应状态变化的连锁反应。比如波纹,API21
TransitionDrawable LayerDrawables的扩展,旨在在第一层和第二层之间交叉淡入淡出。
NinePatchDrawable 可调整大小的位图,带有可定义的可伸缩区域。
PictureDrawable 包装图片的可绘制子类,允许在支持Drawable的任何地方使用图片。
ShapeDrawable 绘制原始形状的可绘制的Drawable
PaintDrawable可绘制的,绘制在给定的油漆边界,可选的圆角。
VectorDrawable这使您可以基于XML矢量图形创建绘图。API21
作者:难得糊涂与君勉
链接:https://www.jianshu.com/p/9ba...
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。