【知识点记录】Android自定义控件开发入门与实战 - 第一章:绘图基础

  1. Color
    与颜色处理相关的类。

    常量颜色
    BLACK、BLUE、RED、GRAY、WHITE、YELLOW等等。

    构造颜色
    (1)带透明度的颜色:

    static int argb(int alpha, int red, int green, int blue){}
    
    分别传入A、R、G、B四个颜色分量,合并成一个颜色,其中四个色彩分量的取值范围均为:0~255。
    A:透明度,取值为0时表示完全透明,取值为255时表示完全不透明。
    R:红色值,取值为0时表示红色完全不可见,取值为255时表示红色完全显示。
    G:绿色值,取值含义同上。
    B:蓝色值,取值含义同上。
    

    (2)不带透明度的颜色:

    static int rbg(int red, int green, int blue){}
    
    构造同(1),只是不允许指定alpha值,alpha取值255。
    

    提取颜色分量
    不仅能通过 Color 类合并颜色,还能从一个颜色中提取指定的颜色分量:

    static int alpha(int color){}
    static int red(int color){}
    static int green(int color){}
    static int blue(int color){}
    

    通过这四个方法提取出对应的A、R、G、B颜色分量。
    比如:

    val green = Color.green(0xFF000F00)
    

    则green的值即为0x0F。

  2. 路径:Path

    Path.Direction参数
    (1)Path.Direction.CCW:counter-clockwise的缩写,逆时针方向的路径。
    (2)Path.Direction.CW:clockwise的缩写,顺时针方向的路径。
    路径方向只作用于根据路径绘制的文字上

    在矩形路径上绘制 “苦心人天不负,有志者事竟成”,效果如图:
    使用路径方向绘制文字

    Path填充模式
    (1) Path.FillType.WINDING:默认值,当两个路径相交时,取相交部分;
    (2) Path.FillType.EVEN_ODD:取path所在但并不相交的部分;
    (3) Path.FillType.INVERSE_WINDING:取path的外部区域;
    (4) Path.FillType.INVERSE_EVEN_ODD:取path的外部和相交区域。

    区别如图所示:
    Path填充模式区别
    书中关于Path.FillType该解释与扔物线HenCoder中不一致:https://hencoder.com/ui-1-1/

    重置路径
    为了重复利用空间,节省内存,将原有Path对象的所有路径清空。

    void reset()
    void rewind()
    

    两者的区别:
    rewind()函数会清楚FilllType以及所有的直线、点、矩形等数据,但是会保留其数据结构,这样可以快速复用,提升一定的性能。例如,重复绘制一类线段,它们点的数量都相同,那么使用rewind()函数可以保留装载点的数据结构,效率会更高。一定要注意的是,只有在绘制相同的路径时,这些数据结构才可以复用。

    reset()函数等同于clear,它的所有数据空间都会被回收并重新分配,但不会清除FillType。

    从整体上来说,rewind()函数不会清除内存,会清除FillType;reset()函数会清除内存,不会清除FillType。

  3. 文字

    镂空效果
    将Paint.Style设置成STROKE,可以呈现文字镂空效果。

    Paint().apply {
        isAntiAlias = true
        style = Paint.Style.STROKE
        strokeWidth = 2f
        textSize = 60f
        color = ContextCompat.getColor(context, R.color.color_101010)
    }
    
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
    
        canvas?.drawText("床前明月光", 100f, 100f, paint)
    }
    

    效果如图:
    文字镂空效果

    绘制方向:setTextAlign()函数

    public void setTextAlign(Align align){}
    

    参数值为:
    Align.LEFT:在绘制点居左绘制;
    Align.CENTER:在绘制点居中绘制;
    Align.RIGHT:在绘制点居右绘制。

    同样是绘制文字"床前明月光",效果如图:
    设置文字方向效果图

    字体倾斜度:setTextSkewX()函数

    public void setTextSkewX(float skewX)
    

    倾斜是将文字的基线向左或右拉扯,小于0向左倾斜,大于0向右倾斜。
    效果如图:
    字体倾斜效果图

  4. Region
    一块任意形状的封闭区域。

    构造Region
    (1)直接构造:

    public Region(Region region){}
    public Region(Rect r){}
    public Region(int left, int top, int right, int bottom){}
    

    (2)间接构造:

    public Region(){}
    

    间接构造主要通过空参构造函数与set系列函数相结合实现。

    public void setEmpty() //置空
    public void set(Region region)
    public void set(Rect r)
    public void set(int left, int top, int right, int bottom)
    public void setPath(Path path,Region clip)
    

    无论调用set系列函数的Region是不是有区域值,当调用set系列函数之后,原来的区域值就会被set系列函数中的区域值覆盖。

    setPath()函数
    path:用来构造区域的路径。
    Region:与path参数所构成的路径取交集,并将该交集设置为最终的区域。
    当我们需要构造一个path指定的区域时,此时需要传递一个region与path去交集,我们可以传递一个比path大得多的区域,取交集后就是path所对应的区域了。

    举例:
    Region

    区域相交
    Region不是用来画图的,而是用来做各种区域的相交操作的。
    (1) union()函数

    boolean union(Rect r)
    

    将两个区域取并集。
    举例:

    Region region = new Region(10 ,10, 200, 100);
    region.union(new Rect(10, 10, 50, 300));
    

    结果如图:
    Region.union()
    (2) op()函数

    boolean op(Rect r,Op op)
    boolean op(int left, int top, int right, int bottom, Op op)
    boolean op(Region region, Op op)
    

    这些函数的含义为:用当前的Region(调用者)与指定的一个区域执行相交操作,并将结果赋给当前的Region。如果成功返回 true ,失败则返回 false

    最重要的是指定操作类型的 Op 参数:
    Op
    效果如图:
    Op参数效果

  5. Canvas
    (1)每次调用drawXXX()系列函数时,都会产生一个全新的canvas的透明图层,绘制内容都在这个透明图层上,绘制结束后再将绘制内容放到View中。
    (2)如果在调用drawXXX()系列函数前,调用平移、旋转、裁剪等函数对canvas进行了操作,那么这个操作是不可逆的。每次产生的canvas的最新位置都是在执行这些操作后的位置。(使用save()、restore()除外)
    (3)在canvas与屏幕合成时,超出屏幕范围的图像是不会显示出来的。

    画布是有栈的概念的,和Activity栈一样,通过 save() 压栈,restore() 出栈

    //保存画布
    int save(){}
    //恢复画布
    void restore(){}
    //恢复到第几层画布
    void restoreToCount(int count){}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值