自定义 view

为什么需要自定义 View 呢?

比如我们想实现一些自带控件无法实现的效果,如饼图、直方图。

了解自定义绘制。

一个 View 的绘制,是在View 的绘制方法里实现的,绘制方法写了什么内容,view 就怎么样绘制。而自定义绘制,就是需要重写 view 的绘制方法。

绘制方法有好几个,其中最常用的是 onDraw(),它负责 view 主体的绘制,例如 TextView 的文字、 ImageView 的图像。

而其他的绘制方法可以控制视图的遮盖关系。

具体执行绘制操作的,是 onDraw 里的 Canvas 参数。Canvas 就是 Android 里的绘制工具。

了解 Canvas 的方法

Canvas.绘制类方法

  • drawCicle();
  • drawRect();
  • drawPath(); 这个方法是通过描述路径的方式来绘制图形的,绘制组合图形
  • drawBitmap();
  • drawText();
  • drawPoint();
  • ...

canvas.drawCircle(300, 300, 200, paint);

坐标值: 在 Android 里,每个 View 都有一个自己的坐标系,彼此之间是不影响的。这个坐标系的原点是 View 左上角的那个点;水平方向是 x 轴,右正左负;竖直方向是 y 轴,下正上负

Andriod里的 Paint 类,负责绘制时的颜色和风格信息。所谓风格,就是比如画一个圆,是空心还是实心,线条粗细、有无阴影等。

Canvas.辅助类方法

  • ClipXXX();范围裁切
  • Matrix;几何变换

了解 Paint 的方法

  • Paint.setStyle(Style style) 设置绘制模式
  1. FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。它的默认值是 FILL,填充模式。paint.setStyle(Paint.Style.STROKE); // Style 修改为画线模式
  • Paint.setColor(int color) 设置颜色
  • Paint.setStrokeWidth(float width) 设置线条宽度
  • Paint.setTextSize(float textSize) 设置文字大小
  • Paint.setAntiAlias(boolean aa) 设置抗锯齿开关

了解drawPath

Path 有两类方法:

  1. 直接描述路径

    1.1 addXXX():添加子图形

java 复制代码
path.addCircle(300, 300, 200, Path.Direction.CW);
...
canvas.drawPath(path, paint);

1.2 xxxTo() :画线,直线或曲线

lineTo(float x, float y) / rLineTo(float x, float y) 画直线

moveTo(float x, float y) / rMoveTo(float x, float y) 移动到目标位置

moveTo(x, y) 虽然不添加图形,但它会设置图形的起点,所以它是非常重要的一个辅助方法。

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 画弧形

close() 封闭当前子图形

它的作用是把当前的子图形封闭,即由当前位置向当前子图形的起点绘制一条直线。

  1. 辅助设置或计算

Path.setFillType(Path.FillType ft) 设置填充方式

相关推荐
牛哇网络工作室6 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
一笑的小酒馆6 小时前
Androidiot蓝牙配网简单封装
android
愚公搬代码9 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
g105655913910 小时前
LAMP博客平台Wordpress实战
android·mysql·nginx·php
hunterandroid11 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
pengyu11 小时前
【Kotlin 协程修仙录 · 元婴境 · 中阶】 | 操作符真解:Flow 中间操作符与数据流变幻术
android·kotlin
pengyu12 小时前
【Kotlin 协程修仙录 · 元婴境 · 初阶】 | 冷流初啼:Flow 的基础与响应式编程的入门
android·kotlin
wawo0013 小时前
Kuikly实践-从Android compose迁移到kuikly compose
android
Carson带你学Android15 小时前
Android 版 MCP 正式登场:AppFunctions
android·ai编程·jetbrains
古法安卓17 小时前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio