【知识点记录】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
    评论
封面 1 序 2 捐助说明 5 目 录 7 第一章 View的绘图流程 12 1.1、概述 12 1.2、Activity的组成结构 13 1.3、View树的绘图流程 15 1.3.1 测量组件大小 16 1.3.2 确定子组件的位置 17 1.3.3 绘制组件 18 1.4、说点别的 22 1.5 练习作业 22 第二章 Graphics2D API 23 2.1、概述 23 2.2、Point类和PointF类 23 2.3、Rect类和RectF类 25 2.4、Bitmap类和BitmapDrawable类 32 2.5、Canvas类与Paint类 34 2.5.1 绘图概述 34 2.5.2 Paint类 34 2.5.3 Canvas类 39 2.6 练习作业 63 第三章 使用Graphics2D实现动态效果 64 3.1 概述 64 3.2 invalidate()方法 65 3.3 坐标转换 69 3.4 剪切区(Clip) 73 3.5 案例:指针走动的手表 82 3.6 练习作业 88 第四章 双缓存技术 89 4.1 双缓存 89 4.2 在屏幕上绘制曲线 90 4.3 在屏幕上绘制矩形 99 4.4 案例:绘图App 104 4.4.1 绘图属性 106 4.4.2 软件参数 108 4.4.3 绘图缓冲区 109 4.4.4 撤消操作 111 4.4.5 图形绘制 113 4.4.6 绘图区 118 4.4.7 主界面 119 4.5 练习作业 122 第五章 阴影、渐变和位图运算 123 5.1 概述 123 5.2 阴影 123 5.3 渐变 125 5.3.1 线性渐变(LinearGradient) 126 5.3.2 径向渐变(RadialGradient) 130 5.3.3 扫描渐变(SweepGradient) 135 5.3.4 位图渐变(BitmapShader) 138 5.3.5 混合渐变(ComposeShader) 140 5.3.6 渐变与Matrix 142 5.4 位图运算 143 5.4.1 PorterDuffXfermode 143 5.4.2 图层(Layer) 146 5.4.3 位图运算技巧 148 5.5 案例1:圆形头像 152 5.6 案例2:刮刮乐 156 5.7 练习作业 161 第六章 自定义组件 163 6.1 概述 163 6.2 自定义组件的基本结构 164 6.3 重写onMeasure方法 166 6.4 组件属性 175 6.4.1 属性的基本定义 175 6.4.2 读取来自style和theme中的属性 181 6.5 案例1:圆形ImageView组件 186 6.6 案例2:验证码组件CodeView 190 6.7 练习作业 202 第七章 自定义容器 204 7.1 概述 204 7.2 ViewGroup类 205 7.2.1 ViewGroup常用方法 205 7.2.2 ViewGroup的工作原理 208 7.2.3 重写onLayout()方法 213 7.3 CornerLayout布局 217 7.3.1 基本实现 217 7.3.2 内边距padding 224 7.3.3 外边距margin 228 7.3.4 自定义LayoutParams 238 7.4 案例:流式布局(FlowLayout) 246 7.5 练习作业 256 第八章 Scroller与平滑滚动 257 8.1 概述 257 8.2 认识scrollTo()和scrollBy()方法 258 8.3 Scroller类 264 8.4 平滑滚动的工作原理 271 8.5 案例:触摸滑屏 272 8.5.1 触摸滑屏的技术分析 272 8.5.2 速度跟踪器VelocityTracker 273 8.5.3 触摸滑屏的分步实现 274 8.6 练习作业 285 第九章 侧边栏 287 9.1 概述 287 9.2 使用二进制保存标识数据 289 9.2.1 位运算符 289 9.2.2 位运算的常用功能 292 9.3 继承自ViewGroup的侧边栏 293 9.4 继承自HorizontalScrollView的侧边栏 304 9.5 练习作业 312 第十章 加强版ListView 313 10.1 概述 313 10.2 ListView的基本使用 314 10.3 ListItem随手指左右滑动 318 10.4 向右滑动删除ListItem 326 10.5 滑动ListItem出现删除按钮 336 10.5.1 列表项专用容器ExtendLayout 337 10.5.2 列表项能滑出删除按钮的ListView 342 10.5.3 定义布局文件 350 10.5.4 显示ListView 351 10.6练习作业 353 案例代码说明 354

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值