美文网首页
Android自定义View

Android自定义View

作者: NiNko | 来源:发表于2019-08-21 17:39 被阅读0次

    Android自定义View


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


    自定义view绘制流程.jpg

    自定义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是由宽、高和各自方向上对应的测量模式合成的一个值。

      测量模式一共有三种

      模式 二进制值 描述
      UNSPECIFIED 00 默认值,父控件没有给子view任何限制,子View可以设置为任意大小
      EXACTLY 01 表示父控件已经确切的指定了子View的大小。
      AT_MOST 10 表示子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变化等。

    相关文章

      网友评论

          本文标题:Android自定义View

          本文链接:https://www.haomeiwen.com/subject/tgmisctx.html