概述
Android自定义View 其实就是:布局、绘制 、触摸反馈。在绘制的过程中,不管是直方图,饼图,还是其他各种各样复杂的界面,使用自定义绘制都能很轻松的绘制出来,这个就是自定义绘制的过程。
1、Android的绘制是在每个view的绘制方法里发生的,
一个view的绘制方法里写了什么代码,他就绘制什么内容,而自定义绘制就是通过重写绘制方法,插入你自己的绘制代码来实现的。绘制方法不是只有一个,最常用的是onDray()。onDray()这个绘制方法,他负责的是View的主体的绘制。例如TextView的文字,ImageView的图像,都是在onDray()里绘制的,具体执行绘制的是onDray()里面的canvas函数。Canvas 是 画布 ,现实中的画布是画的载体,你把画 画在了载体上,在Android里面,Canvas就是一个绘制工具,他唯一的功能就是绘制。实际上,你所见到的Android界面,基本上都是由Canvas来绘制的。(除了一些游戏,一些3D游戏会用到OpenGl),所以掌握了Canvas,你就基本上能做出所有的界面了。
2、Canvas Paint
Paint本意是颜料,Android里的Paint他是一个加强版的颜料,他负责提供使用的颜色和风格信息。(所谓风格,就是这个圆是空心还是实心,线条粗细是多少,有没有阴影,等等这些附加信息)。
3、Canvas 除了直接的绘制,他还有一些方法,对绘制进行辅助。
1、直接对绘制范围的裁切。(就是将绘制限定在某个范围内,超出的部分全部被裁掉,这些方法全部以clip-开头)
2、绘制内容的几何变换。(例如,放大缩小,平移旋转,还有错切,水平错切垂直错切。绘制内容的集合变换可以理解为把你的绘制区域的四个顶点任意拉扯,绘制的内容就会发生变化)
4、绘制顺序
Android里面的绘制是严格按照顺序的,先绘制的内容会被后绘制的内容覆盖掉。
总结
自定义绘制
- 自定义绘制的方式:重写绘制方法(最重要的方法:onDray());
- 自定义绘制的关键:Canvas,他是一个绘制工具,主要有绘制和对绘制的辅助这两类方法。
- Canvas的绘制方法:drawXXX()(关键参数:Paint(他用来保存颜色和各种风格信息))
- Canvas的辅助类方法:一种是范围裁切(clipXXX()),一种是对绘制内容的几何变换(Matrix);
- 使用不同的绘制方法来控制遮盖关系。
自定义View常用方法的介绍
例:
仿写TextView继承自View,构造方法的调用
image.png
onMeasure():用于测量,测量你的控件的大小。
onDraw():用于绘制,你的控件将要绘制成什么样子。
onTouch():用于触摸,处理与用户交互
自定义属性:用于配置。
onMeasure()
MeasureSpec 类
Android 提供MeasureSpec类,他可以帮助我们测量View,MeasureSpec是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小,在计算中使用位运算是为了提高并优化效率。
测量模式:
1、EXACTLY
精确模式,一个确定的值,layout_width="100dp","match_parent","fill_parent";
2、AT_MOST
包裹内容,既最大值模式,layout_width="wrap_content"
3、UNSPECIFIED
任意大小,想要多大就多大,尽可能大,一般我们不会遇到,如ListView,RecyclerView,ScrollView测量子View的时候给的就是UNSPECIFIED ,一般开发中不需要关注它;
View类默认的onMesaure()方法只支持EXACTLY模式,所以在自定义控件的时候,如果不重新onMesure()方法的话,就只能使用EXACTLY模式。
在查看系统代码会发现,系统最终会调用setMeasuredDimension(int measuredWidth,int measuredHeight)方法将测量后的值设置进去。
onDraw()
提前创建好 Paint 对象,重写 onDraw(),把绘制代码写在 onDraw() 里面,这就是自定义绘制最基本的实现。
Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制一个圆
canvas.drawCircle(300, 300, 200, paint);
}
Canvas.drawXXX() 和 Paint 基础
drawXXX() 系列方法和 Paint 的基础掌握了,就能够应付简单的绘制需求。它们主要包括:
Canvas 类下的所有 draw- 打头的方法,例如 drawCircle() drawBitmap()。
Paint 类的几个最常用的方法。具体是:
Paint.setStyle(Style style) 设置绘制模式
Paint.setColor(int color) 设置颜色
Paint.setStrokeWidth(float width) 设置线条宽度
Paint.setTextSize(float textSize) 设置文字大小
Paint.setAntiAlias(boolean aa) 设置抗锯齿开关
onTouch()
从写onTouch()方法,用来处理触摸事件与用户交互。
/**
* 处理跟用户交互的,手指触摸等等
* @param event 事件分发事件拦截
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 手指按下
Log.e("TAG","手指按下");
break;
case MotionEvent.ACTION_MOVE:
// 手指移动
Log.e("TAG","手指移动");
break;
case MotionEvent.ACTION_UP:
// 手指抬起
Log.e("TAG","手指抬起");
break;
}
return super.onTouchEvent(event);
}
自定义属性
自定义属性就是做到配置不写死,比如我在TextView中text配置什么就显示什么,textColor指定什么颜色就显示什么颜色等等,这些都是自定义属性。首先在res下的values目录下新建一个attrs.xml文件,其他名称可以吗?是可以的如attr.xml或者lqbz.xml但是原则上一看attrs就知道是自定义属性。
引用
Hencoder 自定义View1
红橙Darren 自定义View简介 - onMeasure,onDraw,自定义属性
网友评论