首页 > 其他分享 >带你玩转自定义view系列--Android画笔的详解

带你玩转自定义view系列--Android画笔的详解

时间:2023-07-19 11:32:32浏览次数:32  
标签:自定义 paint -- float Shader Paint radius TileMode Android

View 的简介

View是Android所有控件的基类,接下来借鉴网上的一张图片让大家一目了然(图片出自:http://blog.51cto.com/wangzhaoli/1292313)

带你玩转自定义view系列--Android画笔的详解_android

image

Android画笔的详解

Android提供了2D图形绘制的各种工具,如Canvas(画布)、Point(点)、Paint(画笔)、Rectangles(矩形)等,利用这些工具可以直接在界面上进行绘制。

在自定义View中,我们经常用到的Canvas(画布)和Paint(画笔),像我们画画一样,需要画布和画笔,在View中绘制控件,Canvas就代表着画布,Paint就代表着画笔。

这是的Android的的的官网里画的API:https://developer.android.com/reference/android/graphics/Paint

官网中的API有很多,下面是比较常用的一些API:

Paint.setAntiAlias(boolean flag);//设置抗锯齿效果 设置true的时边缘会将锯齿模糊化Paint.setDither(boolean flag);//设置防抖动,设置true的时图片看上去会更柔和点Paint.setColor(int color);//设置画笔颜色Paint.setARGB(int a, int r, int g, int b); //设置画笔的ARGB值Paint.setAlpha(int alpha);//设置画笔的Alpha值Paint.setStyle(); //设置画笔的style (三种:FILL填充 FILL_AND_STROKE填充加描边 STROKE描边 )Paint.setStrokeWidth(float width);//设置描边宽度Paint.setXfermode(Xfermode xfermode);//设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果Paint.setShader(Shader shader);//设置图像效果,使用Shader可以绘制出各种渐变效果Paint.setShadowLayer(float radius ,float dx,float dy,int color);//在图形下面设置阴影层,产生阴影效果,radius为阴影的半径,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色 //下面写文本的时候经常用到的Paint.setTextSize(float textSize);//设置画笔文字大小Paint.measureText(String text);//测试文本的长度Paint.setTextAlign(Paint.Align align);// CENTER(文本居中) LEFT(文本左对齐) RIGHT(文本右对齐)

下面就演示一下上面这几个API的效果。

Paint.setStye()

Paint.setStyle() //设置画笔的style,有三种:

  • Paint.Style.FILL //将填充使用此样式绘制的几何和文本,忽略绘画中与笔划相关的所有设置
  • Paint.Style.FILL_AND_STROKE //使用此样式绘制的几何和文本将同时填充和描边,尊重绘画中与笔划相关的字段
  • Paint.Style.STROKE //使用此样式绘制的几何和文本将被描边,尊重绘画上与笔划相关的字段

演示一个小demo:

paint = new Paint();       paint.setColor(Color.RED);//画笔颜色为红色       paint.setStrokeWidth(80); //描边宽度为80(为了区分效果,特意设置特别大)       float radius = 100f;       //将填充使用此样式绘制的几何和文本,忽略绘画中与笔划相关的所有设置       paint.setStyle(Paint.Style.FILL);       canvas.drawCircle(400, 200, radius, paint);       //使用此样式绘制的几何和文本将同时填充和描边,尊重绘画中与笔划相关的字段       paint.setStyle(Paint.Style.FILL_AND_STROKE);       canvas.drawCircle(400, 500, radius, paint);       //使用此样式绘制的几何和文本将被描边,尊重绘画上与笔划相关的字段       paint.setStyle(Paint.Style.STROKE);       canvas.drawCircle(400, 900, radius, paint);

结果:

带你玩转自定义view系列--Android画笔的详解_着色器_02

image

Paint.setShader(Shader shader)

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

Shader:着色器,用来给图像着色,此类是基类, Shader的API (https://developer.android.com/reference/android/graphics/Shader)。有5个子类:

  • BitmapShader
  • ComposeShader
  • LinearGradient
  • RadialGradient
  • SweepGradient

在了解上面5个类之前,先了解一下Shader.TileMode这个枚举,有三个值:

  • Shader.TileMode.CLAMP :如果着色器在其原始边界之外绘制,则复制边缘颜色
  • Shader.TileMode.MIRROR :水平和垂直重复着色器的图像,交替镜像,使相邻的图像始终接缝
  • Shader.TileMode.REPEAT :水平和垂直重复着色器的图像
BitmapShader

这里只介绍一种着色器,其余的点击阅读原文进行查看。

其实这个Shader用于绘制bitmap作为纹理,然后通过平铺模式进行填充

/**        * 构造函数        * @bitmap 用来填充图形的Bitmap        * @tileX X轴Bitmap用Shader.TileMode模式填充        * @tileY Y轴Bitmap用Shader.TileMode模式填充        */       BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

演示一下:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.flower);       BitmapShader shader = new BitmapShader(bitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.MIRROR);       paint.setShader(shader);       canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);

结果:

带你玩转自定义view系列--Android画笔的详解_android_03

image

X轴用Shader.TileMode.CLAMP模式,就是用bitmap的右边缘去填充X轴的其余空间 Y轴用Shader.TileMode.MIRROR模式,就是在用相邻两张图像互为镜像的方式填充整个Y轴其余空间

接下来XY轴换一下模式:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.flower);       BitmapShader shader = new BitmapShader(bitmap, BitmapShader.TileMode.MIRROR, BitmapShader.TileMode.REPEAT);       paint.setShader(shader);       canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);

结果:

带你玩转自定义view系列--Android画笔的详解_android_04

image

X轴用Shader.TileMode.MIRROR模式,就是在用相邻两张图像互为镜像的方式填充整个X轴其余空间 Y轴用Shader.TileMode.REPEAT模式,就是用相同的图像重复填充整个Y轴其余空间

其余四种着色器示例请阅读原文进行查看。

Paint.setShadowLayer(float radius ,float dx,float dy,int color)

Paint.setShadowLayer(float radius ,float dx,float dy,int color) //在图形下面设置阴影层,产生阴影效果

/**        * @radius radius为阴影半径,半径越大,阴影面积越大,越模糊;反之,半径越小,阴影面积越小,也越清晰,radius=0时,阴影消失        * @dx dx为阴影在x轴上的偏移值        * @dy dy为阴影在y轴上的偏移值        * @color color为阴影的颜色        */       Paint.setShadowLayer( float radius, float dx, float dy, int color);

演示一下:

paint.setColor(Color.RED);       paint.setShadowLayer(20, 0, 0, Color.YELLOW);       paint.setTextSize(100);       canvas.drawText("I am Layne", 200, 300, paint);

结果:

带你玩转自定义view系列--Android画笔的详解_着色器_05

image

改一下:

paint.setShadowLayer(20,50, 50, Color.YELLOW);

结果:

带你玩转自定义view系列--Android画笔的详解_着色器_06

image

改一下:

paint.setShadowLayer(1,50, 50, Color.YELLOW);

结果:

带你玩转自定义view系列--Android画笔的详解_着色器_07

image

再改一下:

paint.setShadowLayer(0,50, 50, Color.YELLOW);

结果:

带你玩转自定义view系列--Android画笔的详解_android_08

image

添加阴影:

paint.setColor(Color.RED);       paint.setShadowLayer(30, 0, 0, Color.BLACK);       setLayerType(LAYER_TYPE_SOFTWARE, paint);//要注意加上这句       canvas.drawCircle(400, 800, 100, paint);

**结果: **

带你玩转自定义view系列--Android画笔的详解_着色器_09

image

常用画笔的 API 介绍完了

标签:自定义,paint,--,float,Shader,Paint,radius,TileMode,Android
From: https://blog.51cto.com/u_16175637/6773429

相关文章

  • hbase预分区
    HBase预分区HBase是一个基于Hadoop的分布式列存储系统,它提供了高可靠性、高可扩展性和高性能的数据存储和访问能力。在HBase中,数据是以表的形式进行组织和存储的,而表是由行和列组成的。HBase的数据模型非常灵活,可以根据需要进行动态的列扩展。而在实际应用中,表的大小和数据的分布......
  • hbase启动没有hmaster
    HBase启动没有HMaster介绍HBase是一个分布式的、面向列的、基于Hadoop的NoSQL数据库。它提供了高可靠性、高性能和弹性的数据存储,适用于大规模数据存储和随机实时读写。在HBase中,HMaster是一个主节点,负责管理RegionServer和协调集群中的各项操作。然而,在某些情况下,HBase启动时可......
  • hbase建库命令
    HBase建库命令教程作为一名经验丰富的开发者,我将教会你如何在HBase中创建一个数据库。下面是建库的整个流程以及每一步所需的代码和注释。建库流程步骤描述步骤一配置HBase环境步骤二创建一个HBase连接步骤三创建一个数据库表步骤四关闭HBase连接步骤......
  • hbase和hadoop的关系
    HBase和Hadoop的关系概述本文将向刚入行的小白介绍HBase和Hadoop之间的关系以及实现的流程。首先,我们将介绍整个流程,并使用表格展示每个步骤。然后,我们将详细说明每个步骤需要执行的操作,并提供相应的代码和注释。流程概览步骤操作第一步安装Hadoop第二步配置Hado......
  • shutdown 命令 新功能 加参数 重启进入BIOS 加参数 重启进入启动选项
    如上图,shutdown/r/fw注释:此命令,运行后,作用:重启进入BIOS......
  • 推荐一个c#工具库
     Masuit.Tools.Core   基础功能包.NET Framework版本的包因打包环境异常,无法正常发布更新,目前暂时停更~.NETFramework≥4.6.1PM> Install-Package Masuit.Tools.Net.NETStandard≥2.1或只想使用一些基本功能通用项目推荐首选包PM> Install-Package Masu......
  • Python 报错 Could not guess image MIME subtype
    Python报错CouldnotguessimageMIMEsubtype问题描述:使用MIMEImage打包图片时,报错CouldnotguessimageMIMEsubtypefromemail.mime.imageimportMIMEImageidentification=uuid.uuid4().hexwithopen(abspath,"rb")asf:content=f.read()img=MIMEIm......
  • top命令怎么看
    top命令怎么看参数参数含义-d多久刷新一次,默认5秒-b从上往下一直输出信息而不是自动刷新-n要输出几次信息,或者是要刷新几次-p指定特定的pid进程号进行观察例子每三秒刷新一次top-d3只查看某个进程top-p15722看某个进程,且一次一次显示看,而......
  • Git子模块使用说明
    介绍前端不同应用存在公共的脚本或样式代码,为了避免重复开发,将公共的代码抽取出来,形成一个公共的git子模块,方便调用和维护。软件架构本仓库代码将作为git子模块,被引用到其他仓库中,不可单独运行。使用说明1.添加子模块gitsubmoduleaddhttps://github.com/*.git/src/......
  • Java高并发之CyclicBarrier简介(转)
    原文:https://juejin.cn/post/7209617649885184058作者:xindoo来源:稀土掘金  Java中的CyclicBarrier是一种同步工具,它可以让多个线程在一个屏障处等待,直到所有线程都到达该屏障处后,才能继续执行。CyclicBarrier可以用于协调多个线程的执行,以便它们可以在某个点上同步执行......