自定义控件在日常开发中也是必须的,主要包括以下几方面:
- 自定义控件简介
-
自定义View的三种形式
- 通过例子来实现
概念:Android中组件必须是View的直接子类或间接的子类,其中View有一个ViewGroup的子类,用于定义容器,(FrameLayout,LinearLayout,都是ViewGroup的子类)。如果组件中还子组件,就是从ViewGroup类继承,否则从View类继承.View类就相当于控件的上帝一样,只要你自定义控件,要么是View的直接子类,要么就是View的间接子类。
VIew类定义组件相关的通用功能,只要是自定义控件一定会和View产生关系,所以View是我们开发者,必须要详细理解的类。
自定义View的三种形式:
1. 扩展式自定义View继承自Android原生特定的View:如TextView,ImageView等等,我们通过重写OnDraw等回调方法进行扩展!使其实现我们想要的功能或者形式!
注意:该方法实现的自定义View控件不需要自己支持wrap_content和padding(因为继承的View已经实现了)。
2. 组合式自定义View继承自ViewGroup的子View(LinearLayout,RelativityLayout,FrameLayout...)当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法。
注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程(因为已经估值好了)。
3. 完全自定义View继承自View(android中所有控件的基类),通常实现一些不方便布局的组合方式来达到的,需要静态或动态的显示一些不规则的控件或图形。
注意:方法实现的自定义View需要自己支持wrap_content和Padding(完全从无到有,系统是无法确定,必须自己操作)。
那我们来进入代码阶段来看看到底如何使用的:
打开Studio,新建一个class(MyView):
/** * date:2016/12/5 * author:高健博(gaojianbo) * function:自定义一个view * 步骤:0.继承类View * 1.重写构造方法 * 2.重写OnMeasure方法 * 3.重写OnDraw方法 * 4.使用自定义控件 */ public class MyView extends View{ //在代码中添加我们自定义的view时,所调用的构造方法 public MyView(Context context) { super(context); } //在布局XML文件中,添加我们在定义的控件时,所调用的方法,多了一个参数AttributeSet public MyView(Context context, AttributeSet attrs) { super(context, attrs); } //这个构造方法我们一般用不到,不是系统调用的,需要我们显示调用,并给defStyleAttr传值,多了一个参数 //引用Style资源属性参数时,也就是我们可以在Style中自定义View,定义一个默认的属性、样式、然后添加进来。 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //测量view控件,决定控件在手机所占位置的大小 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } //这个方法绘制了控件,决定了控件呈现的样式,参数就是一个画布,可以直接使用 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //1.定义画笔 Paint paint = new Paint(); //设置抗拒齿 paint.setAntiAlias(true); //设置画笔的宽度(粗细) paint.setStrokeWidth(3); //设置画笔的颜色 paint.setColor(Color.BLUE); //设置画笔的样式 Paint.Style.STROKE:画笔为空心 Paint.Style.FILL_AND_STROKE:画笔为实心 paint.setStyle(Paint.Style.STROKE); //设置画笔所绘制的文本字体大小 paint.setTextSize(50); //绘制一个圆,参数1和2:指定圆心 参数3:指定半径r, 参数4:画笔 canvas.drawCircle(300,100,80,paint); //绘制一个文本,参数1:要画文本 参数2和3:起始座标 canvas.drawText("今儿个真高兴",100,300,paint); //绘制直线,参数1和2:开始画直线的坐标 参数3和4:直线结束的坐标 canvas.drawLine(0,400,300,400,paint); //绘制路径,首先创建路径对象 Path path = new Path(); //移动到某个点 path.moveTo(60,60); path.moveTo(120,0); path.moveTo(180,120); //绘制直线 path.lineTo(60,60); path.lineTo(120,0); path.lineTo(180,120); //图形闭合 path.close(); //开始作画,参数1:path对象,参数2:画笔 canvas.drawPath(path,paint); } }效果图:
在这里跟大家简单说一下坐标的问题:
从这个效果图大家可以看出来,Studio将手机按照X、Y轴进行划分,左上定点为坐标原点。