【Android】绘制

Surface从SurfaceFlinger通过dequeueBuffer申请buffer,新建了一个SkBitmap,再用这个Bitmap对象构造一个native的Canvas对象(SKCanvas)。
ViewRootImpl会创建Canvas持有SKCanvas,这个Canvas就是我们可以操作的Canvas。

Canvas常见操作

【Android】绘制_第1张图片
二阶贝塞尔绘制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之间的间距

【Android】绘制_第2张图片

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...
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(android)