之前模模糊糊的谢过一些自定义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:表示子布局想要多大就多大,很少使用(我是不知道什么时候出现的。)
当我们要知道使用WARP_CONTENT时所需要的控件宽高的时候就需要计算了,这时候我们就必须知道有什么附加的宽和高。例如如果继承View的话就需要知道Padding····
但是还有别的吗?我们查阅下文档。