Android自定义View

Android自定义View


前一阶段学习android自定义view,买了好几本Android源码分析的书,看书里边关于view的绘制过程的分析。结果看的云里雾里,感觉并没有学到什么东西,后来在github上看教程,看别人的代码,感觉有点收获,所以写了这一篇博客。同时我认为学习这方面的知识,直接去看源码分析效果不好,而应该先学习如何操作,等到有了一点经验或者说入了门之后,再去分析源码,会有更好的效果。


自定义view分类

主要是按照自己编写的类所继承的父类来分类,一种是自定义的ViewGroup,大多继承自ViewGroup或者是各种Layout;第二种是继承自View类或者是其他的各种view的子类

自定义view的各个重要的方法

  1. 构造函数

    构造函数是View的入口,用于初始化view的内容,获取自定义的属性。

    public ClockView(Context context){
        this(context,null);
    }
    public ClockView(Context context, AttributeSet attrs){
        super(context,attrs);
    }
    public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    

    调用一个参数的构造函数

    ClockView clockview = new ClockView()

    调用两个参数的构造函数

    <com.example.dell.MyView.DigitClockView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/digit_clock"/>
    
  2. onMeasure函数

    onMeasure方法的作用是测量View的大小,函数有两个参数protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec),两个int型的参数,与宽高有关,我们能从中获取宽高的数据。

    onMeasure函数中的参数widthMeasureSpec与heightMeasureSpec是由宽、高和各自方向上对应的测量模式合成的一个值。

    测量模式一共有三种

    模式二进制值描述
    UNSPECIFIED00默认值,父控件没有给子view任何限制,子View可以设置为任意大小
    EXACTLY01表示父控件已经确切的指定了子View的大小。
    AT_MOST10表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。

    实际应用中使用getSizegetMode方法获取数值与模式

    int Width  = MeasureSpec.getSize(widthMeasureSpec);
    int modeWidth  = MeasureSpec.getMode(widthMeasureSpec);
    
  3. onSizeChanged方法

    此函数在View大小发生变化时调用,比如父控件影响view大小时

     @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
        }
    

    函数参数中的w,h,即为view最终的宽高。

  4. onLayout方法

    此方法用于确定子view的位置,在自定义GroupView中用到。

    在自定义的ViewGroup中,此方法一般循环取出子view,计算出子view的位置,然后使用child.layout(l, t, r, b);设置子view的位置。

  5. onDraw方法

    onDraw方法实际负责图形的绘制,使用Canvas和Paint绘制。

  6. 提供接口

    最终自定义view需要给外部提供一个接口用于控制view状态或监听view变化等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值