自定义View(三)---自定义View整个流程的梳理与总结

转载请注明出处:From李诗雨—http://blog.csdn.net/cjm2484836553/article/details/71024436

不诗意的女程序猿不是好厨师~

在自定义View(一)–View的基础概念,工作流程及生命周期的理解中我们了解一些自定义Veiw的基本知识点,也熟悉了View的整个工作流程,对它的生命周期也算得上很熟悉了。接着自定义View(二)–表层浅析View的事件分发机制和滑动冲突中,我们也能算得上十分细致的总结了View的事件分发机制,并且也收获了解决滑动冲突的方法。其实这两篇文章基本上已经将自定义View讲得差不多了。那我又为什么写了这个自定义View(三)—自定义View整个流程的梳理与总结呢?原因是我想再概括地把整个自定义View的流程再拎一下,好在以后的自定义View之路上,都能以这个方向,有条不紊地走下去。

下面就是一个自定义View的产生应该有的心路历程:

1. 首先应该先考虑继承什么:
是继承 View ,还是ViewGroup ,还是继承一个具体控件(textView,LinearLayout)

2. 考虑自定义属性:

补:自定义View的属性的步骤
①自定义View的属性,首先在res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。

  
<resources> 
    <declare-styleable name="CustomTitleView">  
        <attr name="titleText" />  
        <attr name="titleTextColor" />  
        <attr name="titleTextSize" />  
    declare-styleable>  
resources>  

②在自定义View类的构造方法中, 解析自定义属性的值并做相关处理。

//得到所有自定义属性的数组
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);  
        int n = a.getIndexCount();  
        for (int i = 0; i < n; i++)  
        {  
            int attr = a.getIndex(i);  
            switch (attr)  
            {  
            case R.styleable.CustomTitleView_titleText:  
                mTitleText = a.getString(attr);  
                break;  
           case R.styleable.CustomTitleView_titleTextColor:  
                /** 默认颜色设置为黑色  */
                mTitleTextColor = a.getColor(attr, Color.BLACK);  
                break;  
            case R.styleable.CustomTitleView_titleTextSize:  
                // 默认设置为16sp,TypeValue也可以把sp转化为px  
               mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(  
                       TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));  
                break;  
         }  
       }  
       a.recycle();  

③在布局文件中引用当前应用的名称空间,即在布局文件中添加schemas声明。

 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"

④在自定义视图标签中使用自定义属性


3. 重写其相关回调方法:

onFinishInflite()或onAttachToWindow(): 得到子View对象

onMeasure(): 通过测量得到子View的宽高
注意: 如果对View的宽高进行修改了,不要调用super.onMeasure( widthMeasureSpec, heightMeasureSpec); 而要调用 setMeasuredDimension( widthsize, heightsize); 这个函数。

思考: 为什么要测量View大小?
答:View的大小不仅由自身所决定,同时也会受到父控件的影响,为了我们的控件能更好的适应各种情况,一般会自己进行测量。
规则可参看下表:

onSizeChanged(): 确定View大小,这个函数在视图大小发生改变时调用。

onLayout(): 确定布局的函数,它用于确定子View的位置。
注意:在自定义ViewGroup中会用到,他调用的是子View的layout函数。onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用chid.layout(l,t,r,b)函数设置子View位置。

onDraw(): 进行绘制。

等等等~


4. 对于具有滑动效果的自定义View,还要做相关的滑动处理


5. 如果遇到滑动冲突还需要解决相应的滑动冲突

6.使用我们写的自定义View

通过自定义View的一、二、三这三篇文章的知识点和结论,我们已经完全具备去自定义View的能力,那我们还等什么?
下一篇,就让我们来写一个简易的侧滑菜单吧~

你可能感兴趣的:(自定义View的多彩世界)