您的位置:首页 > 其它

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

2017-04-30 17:53 253 查看
转载请注明出处: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 , 在里面定义我们的属性和声明我们的整个样式。

<?xml version="1.0" encoding="utf-8"?>
<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