关于自定义view, 本人的总结以及看法

来源:互联网 发布:redis存储数据大小 编辑:程序博客网 时间:2024/05/01 18:36

   android世界中。 万物皆为view。  不管是控件还是布局 都是继承与view实现的, 

   有人可能会提问。 viewgrop呢? 这个先不谈,  viewgrop继承了view , 但viewgrop里面也会有view或viewgrop 所以说是一层层循环嵌套下去。


     自定义view 继承view    实现三个构造函数,然后2个参数的构造函数掉三个参数的构造函数,1个构造函数的参数调2个参数的构造函数, 

   不要问我为什么。源码就是这样写的


  第二步:在value文件下面创建个attrs文件,然后创建了三个属性。文本文字,颜色和大小



   //然后第三步 创建MyView类继承view 并在三个参数的构造函数中依次调用出属性

   并将这些属性赋给mTitleText,mTitleColor,mTitleSize,  

     typedArray. 看名字也知道是属性集合  通过调用getIndexCount();获得属性的下标,然后循环依次赋值, 最后记得调用recycle()方法来释放资源



//文本String mTitleText;//文本颜色private int mTitleColor;//文本大小private int mTitleSize;//控制文本的范围private Rect mBound;private Paint mpaint;public Context context;

TypedArray typedArray = context.getTheme().        obtainStyledAttributes(attrs, R.styleable.MyView, defStyleAttr, 0);int n = typedArray.getIndexCount();for (int i = 0; i < n; i++) {    int attr = typedArray.getIndex(i);    switch (attr) {        case R.styleable.MyView_titleText:            mTitleText = typedArray.getString(attr);            break;        case R.styleable.MyView_titleColor:            mTitleColor = typedArray.getColor(attr, Color.BLUE);            break;        case R.styleable.MyView_titleSize:            mTitleSize = typedArray.getDimensionPixelSize(attr, (int)                    (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())));            break;    }}typedArray.recycle();
 然后我们调用ondraw()方法来绘画界面
    基本都看得懂吧? setColor.设置画笔的颜色
   darwRect 设置画布的范围  关于里面的2个参数, 我等会再说
 然后把text值加上去。 
     好了。 别完了在xml中添加xmln命名空间


 

  这样就可以使用自己定义的属性了





  运行下程序,结果就是在左上角。 字体为红色。 背景为黄色, 图我就不贴了。


   

、 上面不是说道getMeasuredHeight()方法了吗?  刚好借这个机会来扯扯view的绘画流程

     构造函数我就不说了, 首先。 先自行的是onMeasure()方法。 然后在执行

onMeasure , 然后执行layout方法。 MesaureHeight()这个是在onMeasureHeight方法中 通过
setMeasuredDimension(width,height)这个方法传过去的, 具体可看源码
  然后在执行onlayout()方法。 onlayout是设定view显示的位置,一般都是默认情况
    getwidth()是获得view的宽, 那么width和mesurewidth()有什么区别或关联呢。
   我们可以通过locat看下,   如果在onmesurewidth()方法中调用getwidth()方法来获取控件的宽度是多大
   会发现logcat打印出来是为0.而getmesurewidth!=0,为什么呢。  因为getwidth是在onlayout中设定位置的实际大小。 
  onlayout在onmesure()方法后调用。 当onlayout()调用后 在不重写onlayout的前提下getwidth和getmesurewidth();是完全一样的。
   当然。 如果想改变view的位置。 可以重写onlayout方法。 传进去你想设定的坐标。 不过此时这两个值就不相等了。
getwidth才是实际值
 如有哪里不懂。 可联系我Q  296562555   私人总结。 不喜勿喷

 

 







 



0 0
原创粉丝点击