自定义view(二):onDraw 之 Paint

2023-12-21 00:18
文章标签 自定义 view paint ondraw

本文主要是介绍自定义view(二):onDraw 之 Paint,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

再来回顾下上一篇 自定义view(一):onMeasure介绍的自定义view的三个重要方法:

    onMeasure(int widthMeasureSpec, int heightMeasureSpec) onLayout(boolean changed, int left, int top, int right, int bottom)onDraw(Canvas canvas)

onMeasure是用来测量view的大小的,跟xml布局相关
onLayout是用来计算view的大小的,决定View在ViewGroup中的位置
onDraw是用来绘制view的


为什么不按照顺序讲onLayout方法呢?
其实对于自定义view来言,onLayout方法基本上不用重写,但是对于自定义ViewGroup而言,此方法确实相当的重要,因为他要计算出viewGroup中所有的子view。今天只讲自定义view,对于viewGroup以后会将。

言归正传(一起暴躁起来),onDraw(Canvas canvas) 方法本身没有什么难点,但是它的内部通常会涉及到几个重要的类:Paint(画笔)Canvas(画板)

让我们来一一介绍:
(一)Paint:Paint API文档
作为一名暴躁的码字猴,看到这么一个类似于工具的类,动动脚趾头想一下,它肯定有很多的属性,而属性的赋值使用的方法一般都是 setXXX( ), 那我们就去暴躁的翻阅一下那些set方法。

看下api,不算多,也就一二十个set方法吧
来来来,下面看:

  • set(Paint src)
    复制一个画笔

  • setARGB(int a, int r, int g, int b)
    还用说么,设置颜色RGB值,第一个参数是透明度

  • setAlpha(int a)
    设置透明度

  • setAntiAlias(boolean aa)
    设置抗锯齿。如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了。

  • setColor(int color)
    设置颜色值

  • ColorFilter setColorFilter(ColorFilter filter)

  • 设置颜色过滤器。也就是滤镜效果,参考详解Paint的setColorFilter(ColorFilter filter)

  • setDither(boolean dither)
    设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些。

  • setFakeBoldText(boolean fakeBoldText)
    设置文本加粗

  • setFilterBitmap(boolean filter)
    设置位图过滤(类似于位图的抗锯齿,在绘制图像时使用)

  • setFlags(int flags)
    设置标志,什么下划线啊啥的

  • setHinting(int mode)
    设置画笔的隐藏模式。 HINTING_OFF or HINTING_ON.(不懂)

  • setLinearText(boolean linearText)
    设置是否打开线性文本标识,文本缓存,(达康书记说:什么玩意啊?!)

  • MaskFilter setMaskFilter(MaskFilter maskfilter)
    设置马赛克过滤器?感觉这玩意在做刮刮乐效果时应该会用到。 怎么使用Android 使用MaskFilter为Paint设置效果

  • PathEffect setPathEffect(PathEffect effect)
    设置路径效果。虚线效果呀,点线效果呀啥的。 详情看这里详解Paint的setPathEffect(PathEffect effect)

  • Rasterizer setRasterizer(Rasterizer rasterizer)
    设置光栅,光栅这东西涉及太多太多物理知识。该方法同样不支持HW在API 21中被遗弃了,所以不推荐使用。(复制过来的,我都不知道是什么)

Shader setShader(Shader shader)
设置着色器,设置画笔的填充效果(BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient)

  • setShadowLayer(float radius, float dx, float dy, int color)
    设置阴影效果
    radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。
    注意: 这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。

  • setStrikeThruText(boolean strikeThruText)
    设置文本删除线。(不造,没用过)

  • void setStrokeCap(Paint.Cap cap)

  • void setStrokeJoin(Paint.Join join)
    设置画线的结尾处的形状 ,结合处的形状,很少用。 详细解释

  • setStrokeMiter(float miter)
    设置笔画的倾斜度,取值:>=0。如:小时候用的铅笔,削的时候斜与垂直削出来的笔尖效果是不一样的。主要是用来设置笔触的连接处的样式。

  • setStrokeWidth(float width)
    当画笔样式(style)为STROKE或FILL_OR_STROKE时(空心样式时),设置笔刷的粗细度。

  • setStyle(Paint.Style style)
    置画笔样式,如果不设置,默认是全部填充(FILL)。可选项为:FILL(填充)、FILL_AND_STROKE(描边并填充)、STROKE(描边)

  • setSubpixelText(boolean subpixelText)
    设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。

  • setTextAlign(Paint.Align align)
    设置文本对齐方式。CENTER,LEFT和RIGHT

  • setTextLocale(Locale locale)
    设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。

  • setTextScaleX(float scaleX)
    设置文本水平方向上的缩放
    将文本沿X轴水平缩放,默认值为1,当值大于1会沿X轴水平放大文本,当值小于1会沿X轴水平缩放文本

  • setTextSize(float textSize)
    设置文字大小

  • setTextSkewX(float skewX)
    设置文本在水平方向上的倾斜。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。

  • Typeface setTypeface(Typeface typeface)
    设置文本字体样式。

  • setUnderlineText(boolean underlineText)
    是否设置自下划线

  • Xfermode setXfermode(Xfermode xfermode)
    设置图像的混合模式,详解Paint的setXfermode(Xfermode xfermode)
    别看这么多方法,其实平时用的最多的也就那几个,就像:

        mPaintRect = new Paint();mPaintRect.setAntiAlias(true);//设置抗锯齿mPaintRect.setStyle(Paint.Style.STROKE);//设置格式为描边mPaintRect.setColor(Color.BLACK);//设置颜色mPaintRect.setStrokeWidth(10);//设置描边宽度

很简单,画笔先给new出来,然后就是设置属性。1岁小孩都会弄。
但是要注意一点,最好不要在onDraw方法中new Paint();
因为onDraw方法有可能会多次调用,(官方给出了invalidate();和postInvalidate();里面调用了onDraw方法。)多次的new 对象,容易影响内存的消耗

ok,知道怎么用画笔了。接下来,就剩下Canvas画板。

参考 :详解Paint的各种set方法
详解Paint的set方法

这篇关于自定义view(二):onDraw 之 Paint的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518036

相关文章

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并