自定义控件的概念和view类的重要性

自定义控件的概念:Android中组件必须是View的直接子类或间接的子类,其中view有一个viewGroup的子类,用于定义容器,(FramenLayout,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,FramLayout....)当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法.
注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程.



3.完成自定义View继承自View(Android中所有空间的基类),通常实现一些不方便布局的组合方式来达到的需求,静态或动态的显示一些不规则的控件或图形
注意:该方法实现的自定义View需要自己支持wrap_content和Padding(完成从无到有,系统是无法确定.必须自己操作)


实现步骤:
( 1.)首先创建一个类,继承View,
自定义控件的概念和view类的重要性
文章图片

( 2.)重写红色框中的方法,因为在实际开发过程当中第4个方法相对而言我们用的比较少,最后点击ok就自动帮你实现好了这三个方法
自定义控件的概念和view类的重要性
文章图片

Java代码

在这里我实现了三个画图:圆,直线,三角形.

public class MyView extends View { //为画笔建立全局对象 private Paint mPaint; //在代码中添加我们自定义View时,所调用的构造方法 public MyView(Context context) { super(context); //在构造方法里初始化画笔对象 mPaint = newPaint(); }//在布局XML文件中添加我们自定义的控件时,所调用的方法,多了一个参数AttributeSet public MyView(Context context, AttributeSet attrs) { super(context, attrs); System.out.println("MyView(Context context,AttributeSet attrs)我被调用了"); //在构造方法里初始化画笔的对象 mPaint = newPaint(); }//这个方法一般我们用不到,不是系统调用,需要我们事先调用并给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); }

在这里重点给大家细说一下实现画笔的一些参数:

//设置画笔的属性,在构造方法里进行了初始化 @NonNull private Paint newPaint(){ //1.0画笔 Paint paint = new Paint(); //设置抗锯齿 paint.setAntiAlias(true); //设置画笔的宽度 paint.setStrokeWidth(3); //设置画笔的颜色 paint.setColor(Color.BLUE); //设置画笔的样式 Style.STROKE:画笔为空心Paint.Style.FILL_AND_STROKE和Paint.Sryle.FILL画笔为实心 paint.setStyle(Paint.Style.STROKE); //设置画笔绘制的文本的字体大小 paint.setTextSize(60); return paint; } //绘制了控件,决定了控件呈现的样式,参数就是画布,可以直接使用 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //2.0 画布 //绘制一个圆,参数1和2:指定的就是圆心,参数3:指定的半径R参数4:画笔 //canvas.drawCircle(100, 100, 80, paint); //绘制一个文本参数1:要画的文本参数2和3画的启示坐标paint参数4:画笔 //canvas.drawText("带你走向人生巅峰", 100, 400, paint); //绘制直线,参数1和2:开始画直线的坐标参数3和4:直线结束的坐标参数5:画笔 //canvas.drawLine(200, 200, 200, 500, 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, mPaint); } }




1:首先我们创建一个Paint(画笔)的对象,也就是说我们画图的时候是不是先得有个笔啊?那么在这里我们也得需要先创建一个画笔.
2:然后通过:paint.setAntiAlias(true)是设置图像的像素点的
3:paint.setStrokeWidth(3)是设置画笔的宽度,通过下面两张图我们可以看出,左1的图要细点,我们在看看右2的这张图明显是不是加粗了许多,如果想要设置画笔的粗和细修改你的参数,参数值越大,画出来的图形就越粗.
自定义控件的概念和view类的重要性
文章图片
自定义控件的概念和view类的重要性
文章图片




4:paint.setColor(Color.BLUE)是设置画笔的颜色,我设置的是蓝色,你也可以选择其它的颜色,这个呢,其实很简单的,我就不细说啦
5:paint.setStyle(Paint.Stryle.STROKE)通过这两个参数可以设置你绘的图是空心还是实心,STROKE是(空心),FILL_AND_STROKE是(实心),如下图:
自定义控件的概念和view类的重要性
文章图片
自定义控件的概念和view类的重要性
文章图片








Java布局:
最后添加你写好的自定义控件


这张图阐述了手机屏幕在android中实际是被划分成X,Y轴坐标

自定义控件的概念和view类的重要性
文章图片

最终实现的3个效果图(圆,文字,三角形):
自定义控件的概念和view类的重要性
文章图片
自定义控件的概念和view类的重要性
文章图片
自定义控件的概念和view类的重要性
文章图片




【自定义控件的概念和view类的重要性】

    推荐阅读