自定义view(二):onDraw 之 Paint

来源:互联网 发布:淘宝网充值 编辑:程序博客网 时间:2024/05/21 14:04

再来回顾下上一篇 自定义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方法

0 0
原创粉丝点击