Android自定义View(一)

本文主要参考hencoder自定义view

自定义View主要掌握以下四块内容:

  1. View的绘制机制:最主要掌握onMeasure,onLayout,onDraw以及相关类的使用。
  2. 事件分发机制:掌握dispathTouchEvent(),onInterceptEvent(),onTouchEvent()三者相关的逻辑。
  3. 属性动画,因为属性动画核心是数值的变化,使用属性动画对值View做动画操作。
  4. 相关手势类

View的绘制机制

自定义View绘制流程图
image

自定义View的绘制就是重写其绘制方法,其中重中之重就是onDraw()。其中最主要就是Paint、Cavans、Matrix等类的使用。

onDraw()使用

我们知道生活中的画一幅画,先不说画得好不好,最起码也是需要画笔、颜料、画布才能画出一个你所要的画,当然我们自定义view也不过如此,其中画笔颜料就是我们所说的Paint对象,画布就是onDraw里的Canvas对象。喏,最基本的可能就是这样:

1
2
3
4
5
6
7
8
9
10
//创建一个画笔工具
Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 在画布上绘制一个圆
canvas.drawCircle(300, 300, 200, paint);
}

看吧,是不是很简单。但是最后不要漏写了 super.onDraw()。

Canvas.drawXXX()的使用

在canvas画布上面你想画什么就画什么好了。也就是调用drawXXX()方法。

  • 填充颜色:Canvas.drawColor(@ColorInt int color)
  • 画圆:drawCircle(float centerX, float centerY, float radius, Paint paint)
  • 画矩形:drawRect(float left, float top, float right, float bottom, Paint paint)
  • 画点:drawPoint(float x, float y, Paint paint)
  • 批量画点:drawPoints(float[] pts, int offset, int count, Paint paint) / drawPoints(float[] pts, Paint paint)
  • 画椭圆:drawOval(float left, float top, float right, float bottom, Paint paint)
  • 画线:drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
  • 画弧线或者扇形:drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
  • 画自定义图形:drawPath(Path path, Paint paint)
  • 画 Bitmap:drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
  • 画文字:drawText(String text, float x, float y, Paint paint)

Paint类在自定义绘制中充当关键角色:画笔,所以我们自然可以为「画笔」做很多操作,比如设置颜色、绘制模式、粗细等.几个最常用的方法,具体如下:

  • Paint.setStyle(Style style) 设置绘制模式
    —> setStyle(Style style) 这个方法设置的是绘制的 Style 。Style 具体来说有三种: FILL, STROKE 和 FILL_AND_STROKE 。FILL 是填充模式,STROKE 是画线模式(即描边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。它的默认值是 FILL,填充模式。
  • Paint.setColor(int color) 设置颜色
  • Paint.setStrokeWidth(float width) 设置线条宽度
  • Paint.setTextSize(float textSize) 设置文字大小
  • Paint.setAntiAlias(boolean aa) 设置抗锯齿开关
    —> 在绘制的时候,往往需要开启抗锯齿来让图形和文字的边缘更加平滑。开启抗锯齿很简单,只要在 new Paint() 的时候加上一个 ANTI_ALIAS_FLAG 参数就行

在画弧线或者扇形中的角度 angle,x 轴正方向为 0°,顺时针方向为正角度,逆时针为负角度。
画弧线或者扇形中的 sweepAngle 参数,代表的是绘制的角度,不要被其它方法误导成了以为是绘制结束时候的角度,官方为何在这里做了个变换,其实我也不知道。
drawPath() 方法可能相对其它较难,但却是自定义 View 实际应用中最多的。非常需要了解其三类方法
drawBitmap() 方法中有个参数是 Bitmap,友情提示:Bitmap 可以通过 BitmapFactory.decodeXXX() 获得。

Path 可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。把这些图形结合起来,就可以描述出很多复杂的图形。Path 可以归结为两类方法:

直接描述路径,也可以分为两组:
添加子图形:addXXX(), 此类方法在特定情况下几个 Canvas.drawPath() 等同于 Canvas.drawXXX()。
画直线或曲线:xxxTo(): 这一组和第一组 addXxx() 方法的区别在于,第一组是添加的完整封闭图形(除了 addPath() ),而这一组添加的只是一条线。
辅助设置或计算,因为应用场景很少,凯哥也只讲了其中一个方法: Path.setFillType(Path.FillType ft) 设置填充方式