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

相关文章

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

添加自定义的CALayer

iOS开发UI篇—CAlayer(创建图层) 一、添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控制器view的layer上)  1 // 2 // YYViewController.m 3 // 01-创建一个简单的图层 4 // 5 //

ScrollView 往上滑动,里面的一个View停在某个位置的思路

1.scrollView的contentoffset 为view的左上角,减去此时scrollView的左上角 2.而且还不需要让那个红色的view removeFromSuperView ,直接self.view AddSubView 就会自动从原来的那个View脱离开来 3.以后遇到问题的思路。当发现UIView很许多奇特的效果的时候,思考它是不是在不断的改变父控件。 #pragma m

导航条下 ScrollView 第一个View去掉向下偏移的64px

self.automaticallyAdjustsScrollViewInsets=NO;      self.scrollView.contentInset=UIEdgeInsetsMake(-64, 0, 0, 0); self.automaticallyAdjustsScrollViewInsets=NO; 相同的意思。

android自定义View的和FramgentActivity的一个小坑

对于自定义View //加载样式TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView, defStyleAttr, 0);setTitle(typedArray.getString(R.styleable.TitleBarView_main_title));//不能写成

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 `SOAPHEADERS` 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类,该子类将继承不特定于方法的标头信息 — 包含在 <request> 或 <response> 元素中的标头信

自定义recyclerView实现时光轴效果

时光轴效果在很多app上都有出现,例如淘宝中快递的跟踪,本文将使用recyclerView实现时光轴效果,我们会到自定义控件,首先先看一下效果图: 接下来是步骤分析 1自定义属性 这个大家应该都了解了,根据我们之前的分析,直接在attrs.xml中进行声明 <declare-styleable name="TimeLine"><attr name="beginLine" f

Android自定义系列——9.Path详细用法

rXxx方法 rXxx方法的坐标使用的是相对位置(基于当前点的位移),而之前方法的坐标是绝对位置(基于当前坐标系的坐标)。 Path path = new Path();path.moveTo(100,100);path.lineTo(100,200);canvas.drawPath(path,mDeafultPaint); 在这个例子中,先移动点到坐标(100,100)处,之后再连接

Android自定义系列——8.Path之贝塞尔曲线

贝塞尔曲线能干什么 贝塞尔曲线作用十分广泛,简单举几个的栗子: QQ小红点拖拽效果一些炫酷的下拉刷新控件阅读软件的翻书效果一些平滑的折线图的制作很多炫酷的动画效果 理解贝塞尔曲线的原理 一阶曲线原理: 一阶曲线是没有控制点的,仅有两个数据点(A 和 B),最终动态过程如下: (本文中贝塞尔曲线相关的动态演示图片来自维基百科)。一阶曲线其实就是前面讲解过的lineTo。 二阶曲线

Android自定义系列——7.Path之基本操作

Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。 作用相关方法备注移动起点moveTo移动下一次操作的起点位置设置终点setLastPoint重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同连接直线lineTo添加上一个点到当前点之间的直线到Path闭合路径close连接第一个点连接到最后一个点,形成一个闭合