Android——UI(二):Paint的基本使用

Android Paint 进阶之滤镜效果(ColorFilter) 上一节整理了图层混合模式(Xfermode),这一节主要整理滤镜(ColorFilter)的使用。 分类 滤镜ColorFilter有三个子类,分别是LightingColorFilter、PorterDuffColorFilter和ColorMatrixColorFilter。 使用 1.LightingColorFilter 首先看下构造函数LightingC... 阅读详情

1、设置线帽

        mPaint.setStrokeWidth(80);
        mPaint.setColor(Color.GREEN);

        //无线帽
        mPaint.setStrokeCap(Paint.Cap.BUTT);
        canvas.drawLine(100, 100, 400, 100, mPaint);
        //圆线帽
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        canvas.drawLine(100, 400, 400, 400, mPaint);
        //方线帽
        mPaint.setStrokeCap(Paint.Cap.SQUARE);
        canvas.drawLine(100, 700, 400, 700, mPaint);

效果图:
setStrokeCap

2、设置Path连接处形状

        Paint paint = new Paint();
        paint.setStrokeWidth(40);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);

        Path path  = new Path();
        path.moveTo(100,100);
        path.lineTo(450,100);
        path.lineTo(100,300);
        //直角
        paint.setStrokeJoin(Paint.Join.MITER);
        canvas.drawPath(path,paint);

        path.moveTo(100,400);
        path.lineTo(450,400);
        path.lineTo(100,600);
        //斜角
        paint.setStrokeJoin(Paint.Join.BEVEL);
        canvas.drawPath(path,paint);

        path.moveTo(100,700);
        path.lineTo(450,700);
        path.lineTo(100,900);
        //圆角
        paint.setStrokeJoin(Paint.Join.ROUND);
        canvas.drawPath(path,paint);

效果图:
setStrokeJoin

3、设置Path连接处圆角半径

        Paint paint = new Paint();
        paint.setStrokeWidth(4);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);

        Path path = new Path();
        path.moveTo(100, 600);
        path.lineTo(400, 100);
        path.lineTo(700, 900);

        canvas.drawPath(path, paint);
        paint.setColor(Color.RED);
        //半径为100
        paint.setPathEffect(new CornerPathEffect(100));
        canvas.drawPath(path, paint);
        //半径为200
        paint.setPathEffect(new CornerPathEffect(200));
        paint.setColor(Color.YELLOW);
        canvas.drawPath(path, paint);

效果图:
CornerPathEffect
原理:
原理

4、绘制虚线

    private void drawDashPathEffectDemo(Canvas canvas) {
        Paint paint = getPaint();
        Path path = getPath();

        canvas.translate(0, 100);
        paint.setPathEffect(new DashPathEffect(new float[]{15, 20, 15, 15}, 0));
        canvas.drawPath(path, paint);
    }

虚线

5、在Path中插入尖刺

private void drawDiscretePathEffectDemo(Canvas canvas) {
        Paint paint = getPaint();
        Path path = getPath();

        canvas.drawPath(path, paint);
        /**
         * 把原有的路线,在指定的间距处插入一个突刺
         * 第一个这些突出的“杂点”的间距,值越小间距越短,越密集
         * 第二个是突出距离
         */
        canvas.translate(0, 200);
        paint.setPathEffect(new DiscretePathEffect(2, 5));
        canvas.drawPath(path, paint);

        canvas.translate(0, 200);
        paint.setPathEffect(new DiscretePathEffect(6, 5));
        canvas.drawPath(path, paint);


        canvas.translate(0, 200);
        paint.setPathEffect(new DiscretePathEffect(6, 15));
        canvas.drawPath(path, paint);
    }

6、小结

Paint的方法主要可以抽象成两大类:

1.1 负责设置获取图形绘制、路径相关的
1.setStyle(Paint.Style style)
设置画笔样式,取值有
Paint.Style.FILL :填充内部
Paint.Style.FILL_AND_STROKE :填充内部和描边
Paint.Style.STROKE :仅描边、
注意STROKE、FILL_OR_STROKE与FILL模式下外轮廓的位置会扩大。

2.setStrokeWidth(float width)
设置画笔宽度

3.setAntiAlias(boolean aa)
设置画笔是否抗锯齿

4.setStrokeCap(Paint.Cap cap) ——demo演示
设置线冒样式,取值有Cap.ROUND(圆形线冒)、Cap.SQUARE(方形线冒)、Paint.Cap.BUTT(无线冒)
注意:冒多出来的那块区域就是线帽!就相当于给原来的直线加上一个帽子一样,所以叫线帽

5.setStrokeJoin(Paint.Join join) —— demo演示
设置线段连接处样式,取值有:Join.MITER(结合处为锐角)、Join.Round(结合处为圆弧)、Join.BEVEL(结合处为直线)

6.setStrokeMiter(float miter)
设置笔画的倾斜度,90度拿画笔与30拿画笔,画出来的线条样式肯定是不一样的吧。(事实证明,根本看不出来什么区别好吗……囧……)
void reset()
清空画笔复位。
void set(Paint src)
设置一个外来Paint画笔。

7.void setARGB(int a, int r, int g, int b)
int getAlpha()
void setAlpha(int a)
int getColor()
void setColor(int color)
获取与设置alpha值、颜色、ARGB等。
final boolean isAntiAlias()

8.void setAntiAlias(boolean aa)
获取与设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢,一般会开启。设置后会平滑一些;
final boolean isDither()

9.void setDither(boolean dither)
获取与设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满、图像更加清晰。

10.setPathEffect(PathEffect effect);
设置绘制路径的效果,如点画线等
(1)、CornerPathEffect——圆形拐角效果
paint.setPathEffect(new CornerPathEffect(100));
利用半径R=50的圆来代替原来两条直线间的夹角
(2)、DashPathEffect——虚线效果
//画同一条线段,偏移值为15
paint.setPathEffect(new DashPathEffect(new float[]{20,10,50,100},15));
intervals[]:表示组成虚线的各个线段的长度;整条虚线就是由intervals[]中这些基本线段循环组成的。比如,我们定义new float[] {20,10};那这个虚线段就是由两段线段组成的,第一个可见的线段长为20,每二个线段不可见,长度为10;
phase:
开始绘制的偏移值
…..

11.setXfermode(Xfermode xfermode);
设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果

12.setMaskFilter(MaskFilter maskfilter);

13.setColorFilter(ColorFilter colorfilter);
设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果

14.setShader(Shader shader);
设置图像效果,使用Shader可以绘制出各种渐变效果

15.setShadowLayer(float radius ,float dx,float dy,int color);
在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
1.2 负责设置获取文字相关的
float getFontSpacing()
获取字符行间距。

float getLetterSpacing()
void setLetterSpacing(float letterSpacing)
设置和获取字符间距

final boolean isUnderlineText()
void setUnderlineText(boolean underlineText)
是否有下划线和设置下划线。

final boolean isStrikeThruText()
void setStrikeThruText(boolean strikeThruText)
获取与设置是否有文本删除线。

float getTextSize()
void setTextSize(float textSize)
获取与设置文字大小,注意:Paint.setTextSize传入的单位是px,TextView.setTextSize传入的单位是sp,注意使用时不同分辨率处理问题。

Typeface getTypeface()
Typeface setTypeface(Typeface typeface)
获取与设置字体类型。Android默认有四种字体样式:BOLD(加粗)、BOLD_ITALIC(加粗并倾斜)、ITALIC(倾斜)、NORMAL(正常),我们也可以通过Typeface类来自定义个性化字体。

float getTextSkewX()
void setTextSkewX(float skewX)
获取与设置文字倾斜,参数没有具体范围,官方推荐值为-0.25,值为负则右倾,为正则左倾,默认值为0。

Paint.Align getTextAlign()
void setTextAlign(Paint.Align align)
获取与设置文本对齐方式,取值为CENTER、LEFT、RIGHT,也就是文字绘制是左边对齐、右边还是局中的。

setSubpixelText(boolean subpixelText)
固定的几个范围:320*480,480*800,720*1280,1080*1920等等;那么如何在同样的分辨率的显示器中增强显示清晰度呢?
亚像素的概念就油然而生了,亚像素就是把两个相邻的两个像素之间的距离再细分,再插入一些像素,这些通过程序加入的像素就是亚像素。在两个像素间插入的像素个数是通过程序计算出来的,一般是插入两个、三个或四个。
所以打开亚像素显示,是可以在增强文本显示清晰度的,但由于插入亚像素是通过程序计算而来的,所以会耗费一定的计算机性能。

int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)
比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串,这就派上用场了~
计算指定参数长度能显示多少个字符,同时可以获取指定参数下可显示字符的真实长度,譬如:
private static final String STR = “ABCDEF”;
mPaint.setTextSize(50);
float[] value = new float[1];
int ret = mPaint.breakText(STR, true, 200, value);
Log.i(“YYYY”, “breakText=”+ret+”, STR=”+STR.length()+”, value=”+value[1]);
//breakText=5, STR=8, value=195.0
void getTextBounds(char[] text, int index, int count, Rect bounds)
void getTextBounds(String text, int start, int end, Rect bounds)
获取文本的宽高,通过bounds的Rect拿到整型。

float measureText(String text)
float measureText(CharSequence text, int start, int end)
float measureText(String text, int start, int end)
float measureText(char[] text, int index, int count)
粗略获取文本的宽度,和上面的getTextBounds比较类似,返回浮点数。

int getTextWidths(String text, int start, int end, float[] widths)
int getTextWidths(String text, float[] widths)
int getTextWidths(CharSequence text, int start, int end, float[] widths)
int getTextWidths(char[] text, int index, int count, float[] widths)
精确计算文字宽度,与上面两个类似。

Android之用setColorFilter在ImageView上面覆盖一层灰色的图层 1 问题 在图片里面覆盖一层灰色的图层 2 解决办法 比如点击图片覆盖黑色 imageView.setColorFilter(ContextCompat.getColor(context, R.color.picture_color_black_80), PorterDuff.Mode.SRC_ATOP); 然后点击图片还原回来 imageView.s... 阅读详情

相关推荐

Codex CLI 的多模型切换实战:如何在中转 API 环境下灵活选择最佳模型

本文详细介绍了在Codex CLI中实现多模型切换的实战技巧,重点解析了如何在中转API环境下灵活选择最佳AI模型。通过配置Node.js环境和智能路由策略,开发者可以根据任务类型、编程语言和成本考量,在GPT-5、Claude和DeepSeek等模型间高效切换,提升代码生成、审查和优化的效率。

weixin_29291185的博客 836

Android Paint.Style属性

可选属性 Paint.Style.FILL设置只绘制图形内容 Paint.Style.STROKE设置只绘制图形的边 Paint.Style.FILL_AND_STROKE设置都绘制 STROKE和FILL_AND_STROKE的粗细是一样的,FILL最细 ...

张雨的博客 7974

【MDC开发者课程】MDC功能软件-归控算法介绍

规控算法

博客标题不能为空我也没办法 1844

Android Paint Style

Android在用画笔的时候有三种Style,分别是 Paint.Style.STROKE 只绘制图形轮廓(描边) Paint.Style.FILL 只绘制图形内容 Paint.Style.FILL_AND_STROKE 既绘制轮廓也绘制内容看一下绘制文字的效果图: STROKE和FILL_AND_STROKE的粗细是一样的,FILL最细

csm_qz的专栏 1万+

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析)

本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。

weixin_28308325的博客 460

FME入门系列教程3-带你玩转GIS数据搬运与处理

FME(Feature Manipulation Engine)就像GIS界的"瑞士军刀",它能轻松解决90%的数据处理难题。我最初接触FME是因为要处理200多个不同格式的CAD地形图,传统方法需要1周时间,用FME只花了2小时!:支持300+数据格式(Shapefile、GeoJSON、CAD、Excel等)添加Reader(数据源):选择示例数据roads.shp。添加Writer(输出):设置输出为GeoJSON格式。:将常用流程保存为Template(.fmwt)

weixin_41234946的博客 1244

Paint

Paint

a1003434346的博客 685

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

本文介绍了拜耳阵列的工作原理(Bayer Pattern)以及常用的彩色滤波矩阵(CFA)

风一样的男子(quinta)的博客 7120

Android 图形用户界面 之 绘图(二) Paint类 主要方法介绍

/** *Paint类介绍 * *Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, *样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, *大体上可以分为两类...

chunqingtai2922的博客 103

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6704

IDEA出现闪退或打不开的解决方法

本身项目比较大,为了打开这个软件,可调节IDEA中安装的bin目录下有个。打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示。(如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可)闪退的多数原因大致是out of memory,内存溢出。查看任务管理器中的进程:(发现内存随时有溢出的情况)但也需要注意,该参数并不是越大越好,适中即可。只有个别原因是需要管理员权限就可执行!可以尽量减少软件的启动。

码农研究僧的博客 5944

Android—图形用户界面之绘图Paint(二)

摘自《Ophone应用开发权威指南》: Java代码   /**       * Paint类介绍       *        * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,       * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,       * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制

victorai60的专栏 573

ADS1115 0-10V高精度ADC模块原理图设计,已量产

在水质监测、智能气象站、环境感知等领域,0-10V 电压输出的传感器占据了重要地位。这类传感器输出信号稳定、抗干扰能力强,但对数据采集模块的精度、线性度和易用性提出了严苛要求。本文将深度解析一款专为 0-10V 传感器设计的高精度 ADC 模块,从硬件架构、性能指标到工程化实践,全面呈现其设计思路与核心价值。

不脱发的程序猿 275

Android进阶——高级UI必知必会之2D绘制与使用Paint对图形进行渲染和滤镜混合处理(二)

文章大纲引言一、Shader系渲染1、Shader2、BitmapShader图形渲染3、LinearGradient线性渲染4、SweepGradient渐变渲染(梯度渲染)5、RadialGradient环形渲染6、ComposeShader组合渲染二、对图片进行滤镜处理1、颜色模式2、像素点的颜色通道3、颜色矩阵4、setMaskFilter设置滤镜三、使用Xfermode完成图片混合处理 ...

最美不过,心中有梦,身旁有你! 1360

VC中sqlite的使用

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

若是曾经查看过系统UI的源码,会发现其中使用了一些渲染效果,例如将图片加上黑白、怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了**滤镜效果、颜色通道过滤**。若还要深究其原理组成,便涉及到了高等数学里的矩阵变换,也就是Android 中的**颜色矩阵**!此篇文章便来一探究竟如何实现滤镜和其原理组成。 (关于矩阵这一块,无需过度深究数学部分,此处为了充分理解渲染效果,只需了解大概原理,利用其API完成简

lemonGuo的大脑皮层、小脑、海马体、杏仁核..... 3643

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Android UI】Paint Gradient 渐变渲染 ② ( SweepGradient 梯度渐变渲染 | 围绕中心点绘制扫描渐变的着色器 | 多渐变色构造函数 | 雷达扫描效果 )

一、SweepGradient 梯度渐变渲染、 1、设置多个渐变颜色的构造函数、 2、设置两个渐变颜色的构造函数、 二、完整代码示例、 1、设置多个渐变颜色的构造函数、 2、设置两个渐变颜色的构造函数、 三、效果展示

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2424

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android粗字体下载,Android中粗字体

前言最近UI大牛出了一版新的效果图,按照IOS的效果做的,页面里面有普通字体、中粗字体、加粗字体。对于IOS的小伙伴,分分钟搞定,但是对于Android开发的我,瞬间懵逼了。WTF!安卓只有粗和不粗呀,哪有中粗这回事。硬着头皮做出来一版之后,看到UI嫌弃的表情。深深的刺痛了我的完美心。说啥也要搞出来中粗的效果,不能Low,不能怂!在查资料的过程中,看到了一篇博客。经过拜读,突发灵感,我擦,竟然这么...

weixin_34820916的博客 216

Android Paint 详细讲解

文章目录1、简介2、Paint 类常用方法介绍1)setColor() 设置颜色2) setStrokeWidth() 设置宽度3)setAntiAlias(true) 抗齿距4) setAlpha() 设置画笔透明度5)setARGB() 设置透明度 和 颜色6) setStyle() 设置画笔样式7) setStrokeJoin() 线条连接处样式 1、简介 在Android 中,2D 的图...

Venus 的博客 1万+

Android高级UI开发(三十八)Paint基本使用

Paint 常用函数 1. 绘制图形、路径等 (1)setStyle(Paint.Style.style) 设置画笔样式,取值有:FILL, FILL_AND_STROKE, STROKE (2) setStrokeWidth(float width) 设置画笔的宽度 (3)setAntiAlias(boolean ): 设置是否抗锯齿 ...

gaoxiaoweiandy的专栏 2576

Android绘图基础:Canvas、Paint等的使用

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 在Android中的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法,Canvas代表了“依附”于指定View的画布,它提供了如下方法绘制各种图形: Canvas还提供了如下...

孤云博客 1万+
上一篇: Android——UI(一):UI绘制流程
下一篇: Android——UI(三):Shader
Chauncey_1993
博客等级 码龄10年 8粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值