自定义View。
2016-06-19 16:43
267 查看
之前模模糊糊的谢过一些自定义View,一直希望能有更深的了解。
教材一
简单的显示–
在这里我和教材并不是完全相同
关键差异
我的看法:这个 for循环是为了给我们的自定义属性,赋予我们自定义的值,索引从min–max就是我们的 attr.xml 文件中所自定义的属性从上到下,也就是索引从 0 到 max(4)
attr.xml
这里有一点:就是这个XML文件名不必要是attr,只要你乐意随便是amao,agou。重要的在于内容,只要节点符合规格就没得问题。
按教材,并不能完美实现,我没有考虑为什么。
总之我的第一步就这么开始并且这么结束了。
接下来我们要显示变得可控。
控制显示位置
* 关于
我们要注意的是那四个参数代表左上角和右下角的两个坐标
关于第一个问题
关于获取文字属性(宽/高):参考
系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT,或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”:
重写之前先了解MeasureSpec的specMode,一共三种类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用(我是不知道什么时候出现的。)
!!深度好文!!
关于MeasureSpaec的一些个人了解
当我们要知道使用WARP_CONTENT时所需要的控件宽高的时候就需要计算了,这时候我们就必须知道有什么附加的宽和高。例如如果继承View的话就需要知道
教材一
简单的显示–onDraw()
在这里我和教材并不是完全相同关键差异
//(3参数)构造方法 public JQ_TextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); /**把我们的自定义属性放到TypedArray中*/ TypedArray typedArray = context.getTheme() .obtainStyledAttributes(attrs, R.styleable.JQ_TextView, defStyleAttr, 0); for (int i = 0; i < typedArray.length(); i++) { switch (i) { case R.styleable.JQ_TextView_textColor: this.textColor = typedArray.getColor(i, Color.BLUE); break; case R.styleable.JQ_TextView_textSize: this.textSize = typedArray.getDimension(i, 200); break; case R.styleable.JQ_TextView_backgroundColor: this.backgroundColor = typedArray.getColor(i, Color.WHITE); break; case R.styleable.JQ_TextView_text: this.text = typedArray.getString(i); this.text = this.text == null ? "" : this.text;//防止报空指针 break; } } typedArray.recycle(); }
我的看法:这个 for循环是为了给我们的自定义属性,赋予我们自定义的值,索引从min–max就是我们的 attr.xml 文件中所自定义的属性从上到下,也就是索引从 0 到 max(4)
attr.xml
这里有一点:就是这个XML文件名不必要是attr,只要你乐意随便是amao,agou。重要的在于内容,只要节点符合规格就没得问题。
<?xml version="1.0" encoding="utf-8"?> <resources> <!--这里是JQ_TextView的自定义属性,我们要了解到,这个XML文件中的一些规则--> <declare-styleable name="JQ_TextView"> <attr name="textColor" format="color"/> <attr name="textSize" format="dimension"/> <attr name="backgroundColor" format="color"/> <attr name="text" format="string"/> </declare-styleable> </resources>
按教材,并不能完美实现,我没有考虑为什么。
总之我的第一步就这么开始并且这么结束了。
接下来我们要显示变得可控。
控制显示位置onMeasure()
探索
首先把文字放到空间的中心
小插曲
我们需要了解的两个知识:1,View的坐标怎么样的;2,文字本身属性的获取;* 关于
Rect类有人说···
我们要注意的是那四个参数代表左上角和右下角的两个坐标
关于第一个问题
通过 View.getX(),View.getY()两个方法可以判断:子View的坐标是相对于父亲View而言的,不是相对于屏幕而言的。
关于获取文字属性(宽/高):参考
关于控件大小的显示
开始之前难免疑问?我们从别人的博客得到这些结论,他们的结论是怎么得出来的,现在我认为是从源码。但是我感觉源码太长,太多,也有太多知识没有储备,总是耐不住性子去看。
系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT,或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”:
重写之前先了解MeasureSpec的specMode,一共三种类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用(我是不知道什么时候出现的。)
!!深度好文!!
关于MeasureSpaec的一些个人了解
当我们要知道使用WARP_CONTENT时所需要的控件宽高的时候就需要计算了,这时候我们就必须知道有什么附加的宽和高。例如如果继承View的话就需要知道
Padding····但是还有别的吗?我们查阅下文档。
相关文章推荐
- Android App中自定义View视图的实例教程
- Android中自定义View实现圆环等待及相关的音量调节效果
- Android开发使用自定义view实现ListView下拉的视差特效功能
- 自定义图表控件--同时显示柱状图和折线图
- android自定义View的用法
- android自定义控件实例
- 自定义view的自定义属性的引用
- android 自定义View onMeasure
- android在自定义View的xml中设置自定义的成员属性
- View与ViewGroup--实现QQ左滑删除
- 自定义android进度条
- android基础之自定义view
- 关于自定义View的一些总结
- 自定义创建View
- 自定义Android圆点指示器
- 【Android】自定义View实现信封红蓝边/收货地址线条
- 自定义View(一)
- Android自定义组件:一个波浪形的组件
- ipad开发中UIPopoverController中自定义view在Xcode6中尺寸匹配问题
- 虎哥带你学自定义View(一)