简述自定义控件(一)

自定义控件在日常开发中也是必须的,主要包括以下几方面:

  • 自定义控件简介
  • 自定义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_contentpadding(因为继承的View已经实现了)。

2. 组合式自定义View继承自ViewGroup的子View(LinearLayout,RelativityLayout,FrameLayout...)当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法

注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程(因为已经估值好了)。

3. 完全自定义View继承自View(android中所有控件的基类),通常实现一些不方便布局的组合方式来达到的,需要静态或动态的显示一些不规则的控件或图形。

注意:方法实现的自定义View需要自己支持wrap_contentPadding(完全从无到有,系统是无法确定,必须自己操作)。

那我们来进入代码阶段来看看到底如何使用的:

打开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);
        //绘制一个圆,参数12:指定圆心 参数3:指定半径r,  参数4:画笔
        canvas.drawCircle(300,100,80,paint);
        //绘制一个文本,参数1:要画文本  参数23:起始座标
        canvas.drawText("今儿个真高兴",100,300,paint);
        //绘制直线,参数12:开始画直线的坐标  参数34:直线结束的坐标
        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轴进行划分,左上定点为坐标原点。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值