赞
踩
再来回顾下上一篇 自定义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画板。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。