自定义控件的概念和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,

( 2.)重写红色框中的方法,因为在实际开发过程当中第4个方法相对而言我们用的比较少,最后点击ok就自动帮你实现好了这三个方法

自定义控件的概念和view类的重要性_第1张图片

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类的重要性_第2张图片                                                    自定义控件的概念和view类的重要性_第3张图片


4:paint.setColor(Color.BLUE)是设置画笔的颜色,我设置的是蓝色,你也可以选择其它的颜色,这个呢,其实很简单的,我就不细说啦

5:paint.setStyle(Paint.Stryle.STROKE)通过这两个参数可以设置你绘的图是空心还是实心,STROKE是(空心),FILL_AND_STROKE是(实心),如下图:

                            自定义控件的概念和view类的重要性_第4张图片                                                    自定义控件的概念和view类的重要性_第5张图片


Java布局:

最后添加你写好的自定义控件




 


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

自定义控件的概念和view类的重要性_第6张图片

最终实现的3个效果图(圆,文字,三角形):

自定义控件的概念和view类的重要性_第7张图片                         自定义控件的概念和view类的重要性_第8张图片                                 自定义控件的概念和view类的重要性_第9张图片



你可能感兴趣的:(Android)