自定义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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06