小试牛刀-初识自定义控件

  最近开发的时候频繁的进行自定义控件。自定义控件是成为高级工程师必不可少的条件之一,所以还是需要认真总结一下的。其实自定义控件也没有想象中的那么复杂,无非只要掌握其中的几个关键方法就能满足绝大部分需求。但是真的要深入进去,都能写一本书了,这里就不做那么深入了。

  简单来说自定义控件无非就两种,自定义View和自定义ViewGroup

自定义View

  可以理解为自定义View的父类,是一个单独的控件,里面无法存放子View。例如TextView,ImageView等都是继承View的,View里面最关键的方法是onMeasure和onDraw。


小试牛刀-初识自定义控件_第1张图片

自定义ViewGroup

  ViewGroup是View的子类,相当于一个容器,里面可以放子View。例如LinearLayout,RelativeLayout等都是继承ViewGroup的。ViewGroup里面最关键的方法是onMeasure和onDraw和onLayout。其中onLayout是ViewGroup中特有的方法,用来实现子View的摆放。


小试牛刀-初识自定义控件_第2张图片

构造方法

public class CustomView extends View {

  /**
   * java代码中声明一个View时调用,不过如果只用第一个构造函数,声明的View并没有任何的参数,基本是个空的View对象。
   */
  public CustomView(Context context) {
    super(context);
  }

  /**
   * 且在布局文件中引用时,在系统初始化该View时调用
   */
  public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  /**
   * 随着View随着主题变化而变化使用
   */
  public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  /**
   * 随着View随着主题变化而变化使用 5.0以后调用  
   *   
   * @param defStyleAttr 只要在主题中对这个属性赋值,该View就会自动应用这个属性的值。
   * @param defStyleRes  只有在第三个参数defStyleAttr为0,或者主题中没有找到这个defStyleAttr属性的赋值时,才可以启用
   */
  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  public CustomView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
  }

}

  一般自定义控件都会在布局中引用,还需要指定一些属性,所以我们一般这么指定构造

public class CustomView extends View {

  public CustomView(Context context) {
    this(context,null);
  }

  public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
  }

  public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initData();
  }

  private void initData() {
    // TODO: 2018/7/6 做一些数据初始化 
  }
}

然后在布局中引用

自定义控件的分类

  • 组合控件:利用系统的控件来组合成一个自定义控件,把多个控件封装成一个控件,实现起来比较简单
  • 自制控件:利用继承View或者ViewGroup后的方法,绘制一个系统没有的控件

  接下来就按照以上的顺序和思路来对自定义控件了解,会结合一些源码以及Demo来分析

基础篇

  • 小试牛刀-onMeasure方法
  • 小试牛刀-onDraw方法
  • 小试牛刀-onLayout方法

你可能感兴趣的:(小试牛刀-初识自定义控件)