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

相关文章

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

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

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 @CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDialog)是什么? CustomDialog是自定义弹窗,可用于广告、中

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD