您的位置:首页 > 其它

自定义View。

2016-06-19 16:43 267 查看
之前模模糊糊的谢过一些自定义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····
但是还有别的吗?我们查阅下文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义View