自定义View之Paint - 基础

Android-高级-UI-进阶之路(四)-Paint-渲染-滤镜-xfermode-使用 文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远! 阅读详情

自定义View有着极大的灵活性,只要敢想总能画出来。既然是画,总是需要工具,那就是所熟悉的的画笔 - Paint。俗话说,工欲善其事必先利其器。接下来,将从Paint的一些列API来认识它。

构造函数

在官方API中,为我们提供了3个构造函数:

  1. Paint()
  2. Paint(int flags)
  3. Paint(Paint paint)

    val paintRed = Paint()
    paintRed.apply {
        color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk)
        // 绘制时可以实现抗锯齿
        flags = Paint.ANTI_ALIAS_FLAG
        // 设置笔触:以路径结束,并不会超过它
        strokeCap = Paint.Cap.BUTT
        // 画笔的样式:只绘画轮廓
        style = Paint.Style.STROKE
        // 设置画笔宽度
        strokeWidth = 36F
    }
    
    val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG)
    paintBlue.apply {
        color = resources.getColor(android.R.color.holo_blue_A<sub>dst</sub>rk)
        strokeCap = Paint.Cap.BUTT
        strokeWidth = 36F
    }
    
    val paintRed_ = Paint(paintRed)
    

在上述示例代码中:

  1. paintRed由默认构造方法创建
  2. paintBlue在创建时传递了Paint.ANTI_ALIAS_FLAG标志位。如果有需要可以同时传递多个标志位

    val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DEV_KERN_TEXT_FLAG)

  3. paintRed_是一个新的Paint,但是在创建时,使用了Paint的属性进行初始化。

常用API

  • reset():重置画笔为默认设置
  • setAntiAlias(boolean aa):设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
  • setDither(boolean dither):设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
  • setFilterBitmap(boolean filter):如果该项设置为true加快显示速度,本设置项依赖于dither和xfermode的设置
  • setLinearText(boolean linearText):使文本平滑线性缩放
  • setElegantTextHeight(boolean elegant):在Android TextView What does elegantTextHeight do? (API 21)中这么解释:这是一种关闭某些语言的“字体压缩”优化的方法。 如果你不知道我在说什么,那可能是因为你的语言没有“字体压缩”优化,这意味着你不需要关心它。
  • setHinting (int mode):设置Paint的提示模式, HINTING_OFF 或 HINTING_ON

Flag

在Paint中定义了一系列的标志位,以便Paint可以显示某些特性,或者对Paint的效果。比如,我们常设置的抗锯齿特性,就可以使用ANTI_ALIAS_FLAG来设置。下面列出了常用的Flag.

  • ANTI_ALIAS_FLAG:绘制时可以实现抗锯齿
  • DITHER_FLAG:使位图进行有利的抖动
  • EMBEDDED_BITMAP_TEXT_FLAG:可以在绘制文本时使用位图字体
  • FAKE_BOLD_TEXT_FLAG:绘制文本应用合成加粗效果
  • FILTER_BITMAP_FLAG:可在缩放位图上实现双线性采样
  • LINEAR_TEXT_FLAG:使文本能够平滑线性缩放
  • STRIKE_THRU_TEXT_FLAG:使用透油装饰绘制文本
  • SUBPIXEL_TEXT_FLAG:使文本的子像素定位
  • UNDERLINE_TEXT_FLAG:绘制文本下划线

如果要FLAG,可以通过调用构造函数 - Paint(int flags),在创建Paint实例时就设置标志位。比如:

val paint = Paint(Paint.ANTI_ALIAS_FLAG)

在创建paint时,就给定了标志位 - ANTI_ALIAS_FLAG,那么在绘制时,可以实现抗锯齿。

也可以调用setFlags(int flags)方法设置标志位:

paint.setFlags(Paint.ANTI_ALIAS_FLAG)

Paint.Cap

Paint.Cap是一个枚举,其指定了针对线条和路径的开始和结束的处理方式。官方的解释有点难懂,容易理解的就是画笔笔触的样式,所谓笔触就是笔与画布接触的部分。比如,平时使用的铅笔,写字时习惯削成圆角,画出来线的两端是圆形;为了方便涂选择的答题卡,又将笔尖削成扁平的长方形,那画出来的线条的两端就是矩形,正好填充答案部分。其默认值为BUTT。

  • BUTT:以指定返回坐标的路径开始和结束,不会超出给定的坐标范围
  • ROUND:笔触是半圆形的,其中心为路径的结束位置。轨迹会超过给定的坐标范围
  • SQUARE:笔触为方形,其中心为路径的结束位置。轨迹会超过给定的坐标范围

这里写图片描述

仔细看效果图,笔触不管是半圆形的还是方形的,其超出的坐标范围的大小与画笔的宽度有关系,都是画笔的宽度的一半。

Paint.Join

Join指定线条和曲线在描边路径的处理方式。默认值为MITER。

  • BEVEL:连接的外缘以直线相交
  • MITER:连接的外缘以锐角相交
  • ROUND:连接的外缘以圆弧相交

这里写图片描述

Paint.Style

Style指定画笔绘制图形时的样式:只绘制图形轮廓(描边),只绘制图形内容 或者既绘制轮廓也绘制内容

  • STROKE:只绘制图形轮廓(描边)
  • FILL:只绘制图形内容,不绘制轮廓
  • FILL_AND_STROKE:既绘制轮廓也绘制内容

这里写图片描述

当绘制轮廓时,笔触的中心当前绘制的位置,其中SROKE和FILL效果图有鲜明的对比。

Paint. Align

见文本之setTextAlign

这里写图片描述

Color

画笔的默认颜色是黑色,这并不是我们想要的颜色。在自定义View时,View的颜色各异。就像前面的例子那样,总是不断指定不同的画笔的颜色。如果想指定颜色可以调用这些方法:

  • setARGB(int a, int r, int g, int b):设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
  • setColor(int color):设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色
  • setAlpha(int a):设置绘制图形的透明度

例如:

    val paintDefault = Paint()

    // Color
    val paintRed = Paint(Paint.ANTI_ALIAS_FLAG)
    paintRed.color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk)

    // Alpha
    val paintAlpha = Paint(paintRed)
    paintAlpha.alpha = 80

    // ARGB
    val paintArgb = Paint(Paint.ANTI_ALIAS_FLAG)
    paintArgb.setARGB(255, 128, 0, 128)

在示例中:

  1. paintDefault的颜色默认的,即黑色
  2. paintRed的颜色通过setColor设置为红色,但未设置透明度
  3. paintAlpha是基于paintRed创建的,不同的是,其将透明度设置为80
  4. paintArgb通过ARGB设置颜色

这里写图片描述

如果对于透明度换算不熟悉的,可参考Android 颜色透明度换算




若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录




如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!

Android自定义View:打造时钟表盘 自定义View是Android开发中一项高级技能,它能够让你根据应用的特定需求设计独特的用户界面。开始创建自定义View之前,首先需要了解其基本步骤,包括继承现有的View类、重写构造函数、onDraw()方法,以及在合适的地方更新视图。每一步都至关重要,它们共同决定了自定义View的外观和行为。在Android系统中,绘图操作是通过View的方法进行的。Canvas是Android提供的一套绘图API,可以看作是一个绘图的画布,负责管理绘图的基本操作,如绘制线条、图形、文本、图片等。 阅读详情

相关推荐

Android Paint 画笔源代码

Android Paint画笔源代码,适用于计算机专业课程设计,并有布局文件。

Android Paint应用一

Paint 顾名思义就是画笔,可以用来设置颜色、测量文字、设置图层混合模式、颜色滤镜等等。 Api中提供了两个构造方法Paint()和Paint(int flags),其中flags的值有以下几种: /** * int flags * //抗锯齿标志 * public static final int ANTI_ALIAS_FLAG = 0x01; ...

lp598876762的博客 1316

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

Paint.setFlags中flag意义及使用方法

设置Flag的两种方法: 第一种: Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 第二种: Paint paint = new Paint(); paint.setFlags(Paint.ANTI_ALIAS_FLAG); 几种Flag意义 Paint.ANTI_ALIAS_FLAG :抗锯齿标志 Paint.FILTER_BIT

云淡风轻的博客 1万+

Spring WebFlux响应式编程实战(三):优雅处理异常与高效调试技巧

本文深入探讨了Spring WebFlux响应式编程中的异常处理与调试技巧。文章通过电商订单流处理场景,详细解析了Reactor核心操作符onErrorReturn、onErrorResume和onErrorMap的实战应用,并介绍了如何构建@ControllerAdvice和WebExceptionHandler全局异常处理防线。同时,提供了使用.log()操作符、Hooks.onOperatorDebug()及BlockHound进行高效调试的方法,旨在帮助开发者构建健壮、可维护的响应式应用。

weixin_29252171的博客 65

别再手动调时间了!用Windows自带的tzutil命令,1分钟搞定时区错误

本文介绍了如何使用Windows自带的tzutil命令快速解决时区错误问题。通过简单的命令行操作,用户可以一键切换时区、查看全球时区代码库,并实现自动化时区同步。相比传统GUI设置,tzutil更可靠且高效,特别适合企业环境批量部署。

weixin_42531494的博客 312

Android Paint ANTI_ALIAS_FLAG 引起的一个小问题

平台 RK3399 + Android 8.1 问题 代码中, 屏幕分辨率为1024x600, 自定义View的尺寸为300x300, 在窗口居中显示. 自定义View绘制的顺序为: 绘制白色背景-Canvas.drawColor 绘制黑色矩形-Canvas.drawRect 绘制红色交叉线, 分别为左上-右下 和 右上-左下 两条 绘制四个角圆, 半径为10个像素 效果图: 在代码中,增加了左右拖动旋转控件的功能 上图的虚线, 非代码绘制 在没有旋转控件前, 并未出现图中的虚线, 而且虚线还会

ansondroider的博客 2325

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

如图所示,用红线圈出的两条头文件引用会报错,提示无法找到他们,但是可以发现的是,他们的路径书写是没有问题的。在终端中运行时候,会出现如下的报错。

GFCLJY的博客 1006

自定义view—绘图基础Canvas+Paint

绘图基础我们开发自定义view的时候,就要绘制自己心仪的图形,这个时候我们就要能够熟练的运用我们的绘图知识,这里我们看一下如何实现一、绘图都需要那些相关知识1、我们平常画画一样,我们需要一张画布(Canvas)2、我们平常画画一样,我们需要一直画笔(Paint)二、我们先来了解下Canvas,Canvas代表了“依附”于指定View的画布,他提供了很多形状的绘制方法,而Paint也提供了一些方法,如

bobo8945510的博客 1674

步进电机梯形加减速算法的实现

步进电机梯形加减速算法的实现

m0_69251699的博客 1318

STM32掉电保存配置参数技巧

本文介绍了使用STM32内置备份寄存器(BKP)实现掉电保存配置参数的方法。相比外接EEPROM或Flash,备份寄存器无需外设但存储容量有限,需通过VBAT引脚连接纽扣电池供电。文章详细说明了初始化步骤,包括使能PWR时钟、允许访问备份寄存器等操作,并提供了RTC初始化的代码示例。同时介绍了HAL库中读写备份寄存器的函数使用方法,包括HAL_RTCEx_BKUPWrite和HAL_RTCEx_BKUPRead函数的具体参数和调用示例。该方法适用于需要小容量数据掉电保存的应用场景。

hanhanhan233的博客 946

android paint 圆角 绘制_Android自定义View基础

Android自定义控件绘图基础首先继承View,并进行相关初始化操作。对于DrawAllocation的Lint警告提示:不要在View绘制和做布局操作的时候实例化数据,将创建对象等这些分配内存资源和会引起垃圾回收机制的操作在onDraw/onLayout之前进行,例如设置为全局变量,提取一个init()方法来实例化对象。因为在View及其子类的onDraw(Canvas canvas)方法,会...

weixin_33673142的博客 574

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

AI人人懂 3818

自定义View基础之——canvas,paint的基本用法

了解了View的绘制流程,并不是立刻就能自定义View了,我们还是需要工具的,那就是Canvas和Paint。不是很了解VIew的,请看上一篇博客,自定义View基础之——初识View。 Canvas代表画布,Paint代表画笔,有了画笔和画布,通过Canvas提供的API,我们当然想画什么就画什么了,接下来我们就看看绘图的基本方法。而在绘图之前,我们通常需要初始化画笔,设置下画笔的各个属性:

阿乐的专栏 2810

【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

AUTOSARAutomotive Open System Architecture,汽车开放系统架构,由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立,致力于制定汽车电子软件标准的联盟。网络管理网络管理的目的是使网络中的ECU节点有序的睡眠和唤醒。在没有通信需求的时候睡眠,在需要通信的时候唤醒,可以节约汽车电池的电量。

测试领域技术分享 5162

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android自定义View之画笔(Paint)基础

官网的解释:Paint类保存有关如何绘制几何图形,文本和位图的样式和颜色信息。 Paint常用的方法 先将所有常用的方法列举出来,然后在一 一测试 Paint的三个构造方法 Paint() // Paint(int flags) Paint(Paint paint) 常用的一些方法 // 初始化画笔 paint = new Paint(); // 设置颜色 paint.setColor(C...

Silicon_Valley 1376

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android自定义View基础--Paint画笔

概念 画笔,保存了绘制几何图形、文本和位图的样式和颜色信息 常用API mPaint = new Paint();//初始化 mPaint.setColor(Color.RED);//设置颜色 mPaint.setARGB(255,255,255,0);//设置Paint对象颜色,范围为0~255 mPaint.setAlpha(200);//设置Alpha不透明度,范围为0~255 mPaint...

yanwenyuan0304的专栏 229

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

自定义View-基础知识-各种关于Paint和Canvas的小总结

资料来源 来自AigeStudiohttps://blog.youkuaiyun.com/aigestudio Paint 资料https://blog.youkuaiyun.com/harvic880925/article/details/51010839 Paint.Style private fun drawStyle(canvas: Canvas?) { val mPaintFor1: Paint = Paint() val mPaintFor2: Paint = Paint() val mPai

AdrianAndroid的专栏 814

自定义View项目实战(一):Canvas与Paint基础

本文重点 着重介绍自绘控件,因为所有的widget归根结底都是使用canvas和paint来绘制的,理解了二者,对于其他的widget原理有溯源的功效。 Canvas:画布 Paint:画笔 怎么做? 继承CustomPainter 重写paint方法与shouldRepaint方法 paint提供来canvas和size,canvas用于绘制,size用于确定大小 shouldRepaint用于确认是否每次都重新绘制 画矩形canvas.drawRect(); void drawRect(Rect r

bugmiao的博客 215

Android 自定义View 基础篇 画虚线 三角 Paint Style Paint Join 对勾 完成按钮 此篇下部分为Android开发自定义控件

Paint.Style.STROKE 只绘制图形轮廓(描边) Paint.Style.FILL 只绘制图形内容 Paint.Style.FILL_AND_STROKE 既绘制轮廓也绘制内容 Paint.Join.BEVEL 斜边Paint.Join.MITER 锐角Paint.Join.ROUND 圆角 圆的 public class CircleView e...

FlyPig_Vip的博客 621

Android自定义View基础--Paint设置PorterDuffXfermode图形混合模式实现遮罩效果,例如头像展示

先上效果 利用Android–Paint设置PorterDuffXfermode图形混合模式实现遮罩效果 通过自定义View重写onDraw方法来用Paint实现遮罩效果,我们之间上代码,代码有注释,全部代码如下可以之间运行 public class MaskView extends View { private Paint paint; private Bitmap bitma...

yanwenyuan0304的专栏 675

自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)

转载请注明出处王亟亟的大牛之路之前也有一个类似于画板的操作,但是不够详细,这边先补上链接,有兴趣的小伙伴可以看看http://blog.youkuaiyun.com/ddwhan0123/article/details/48804761还是老规矩,将内容之前说下我们的一些知识点,今天的第一个知识点有点高达上的名字“硬件加速”。 硬件加速: 问题1:这玩意有什么用? 在绘制View的时候支持硬

王亟亟的博客 2897

mfc 橡皮筋类绘制矩形_自定义View入门-绘制基础(1)

前言说道自定义View,我们一定会想到,自定义View的绘制流程测量阶段(measure)布局阶段(layout)绘制阶段(draw)我们看到的一些炫酷的view效果,都是在绘制方法里去实现的, 也就是draw(Canvas), 我们先放下 测量与布局, 先从绘制基础开始学起。详解说到ondraw(Canvas)方法,不得不提Paint与Canvas。我们先来看Paint1.PaintPaint就...

weixin_39968319的博客 343

HenCoder自定义View学习整理

从HenCoder大牛写的第一篇关于RxJava的文章开始,就一直在关注他。其自定义View系列文章可以说是一大福利,如果更新的速度再快一些,就完美了,哈哈。最近有时间将其自定义View系列文章学习了一遍,收获颇多,通过思维导图的形式总结出来,备忘。 1、绘制基础 2、Paint详解 3、文字的绘制 4、Canvas对绘制的辅助 5、View的绘制顺序 5.1、绘制顺序...

json_it的博客 648
上一篇: Android Support库——support annotations
下一篇: 自定义View之Paint - 绘制文本
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值