初识View-ONE
2017-12-06 17:07
155 查看
开篇短说
做开发很久了,却一直没有真正的去面对自定义View这一块蛋糕。平时,在github或者博客上自学了很多这方面的知识,但是一直不是很系统,总是在真正使用的时候发现,自己在这方面的知识储备显得-很“笨拙”,只能应对一些简单的!!借着最近项目不紧张,再次进行View的系统学习,并在这里记录一下自己的学习过程。足迹是我学习的写照,请不要谎说,你一直在谈恋爱!开门见山
自定义View,在extends View时,需要实现几个构造方法,有什么含义?自定义属性,在./values/attrs.xml下的标签declare-styleable 是干嘛的?
标签declare-styleable下的 format 有什么作用?
不使用declare-styleable 可以吗?TypedArray 能干嘛?
开始详述
自定义View,在extends View时,需要实现几个构造方法,有什么含义?看图
第一个构造方法使用环境:平时我们在通过 new 创建一个控件对象时候,被调用。如,MyView tView = new MyView (context);
第二个构造方法使用环境:平时我们自定义了一个MyView ,然后要将自定义的MyView 放在xml布局中使用时。
第三个构造方法使用环境:系统默认情况下,第三个构造函数是不会被调用的。她的调用只是在,通过我们通过自己的代码来启用。如上图!!
自定义属性,在./values/attrs.xml下的标签declare-styleable 是干嘛的?
首先让我们来看一下系统的,在SDK下,如图:然后我们可以看到一些代码:
<declare-styleable name="View"> <attr name="id" format="reference" /> <attr name="tag" format="string" /> <attr name="scrollX" format="dimension" /> <attr name="scrollY" format="dimension" /> <attr name="background" format="reference|color" /> ... ... </declare-styleable> <declare-styleable name="TextView"> <attr name="text" format="string" localization="suggested" /> <attr name="hint" format="string" /> <attr name="textColor" /> <attr name="textSize" /> <attr name="textScaleX" format="float" /> <attr name="cursorVisible" format="boolean" /> <attr name="maxLines" format="integer" min="0" /> ... ... </declare-styleable>
declare-styleable 解释: 所有的资源文件在R中都会对应一个整型常量,并通过这个ID值能找到对应的资源文件。属性在R中对应的类是public static final class attr,如果我们写declare-styleable,就会在R文件中就会生成 对应的 styleable 类,这个类就是将每个控件的进行属性分组,然后记录属性的索引值。
通过观察上面 attrs.xml 中的代码,可以看到所有的控件属性设定都是通过”declare-styleable”标签进行分组划分,attrs.xml 文件中定义属性的固定模式:通过标签来设定属性,如上代码的 “declare-styleable”、”name”、”attr”、”format”等标签。
还有一点,平时我们自定义一个View,然后有一些属性并没有定义。但是我们依然可以使用,为什么?因为所有的控件都是View的子类,这时我们使用的是View在系统下的默认属性。如
android:layout_width="match_parent"
但并不是每个View的子控件都能有所有属性,父控件View拥有的属性其子控件可共同拥有,而对于子控件自己所定义的特色属性,如TextView 的
android:text="Hello World!"或 ImageView的
android:src="@color/colorAccent"是每个控件独自持有的。
由此,如果我们想要去实现一些特殊的效果。且当系统下现有的控件已经不足以满足我们的需求,这个时候,我们就要自己去自定义View。即自定义满足需求的属性。
我想很多朋友会问,”format” 有什么用?
当然,当我们自己进行自定义View的时候,都是仿照系统下的定义View格式进行的。所以我们进入到SDK中的 attrs.xml 属性文件进行查看时,发现这些attr属性表示的格式并不尽相同。有的有标签”format”,有的却没有!
如:
<attr name="textSize" /> <attr name="textScaleX" format="float" />
解释一下,有”format”限定的属性表示:在此控件下正在自定义自己特色的且属于自己的属性;反之,是在使用其父类已经存在的属性;
但即使系统已经定义了的属性,只要是我们自己定义的控件,我们也需要申明此属性,表示我们要使用她。系统定义过的属性是给系统下的控件使用,而非给我们自定义的控件使用,而不申明则不能使用。所以有两种定义的表示方式-再次申明和重新定义:
在 attr.xml 中使用 format 标签的时候,请看:
通过上面叙述,能够写出各种类型控件的完整属性。但是完之后,我们怎么在xml文件中获取控件的属性值,以便在控件中使用。
这时,我们进入到一个 xml 文件中,看到红色线框中内容:
他们被称作”命名空间”,比如 “android:layout_width=”match_parent”” 的 “android” 表示通过命名空间查找属性 “layout_width” 的来源。当然这个是针对系统 android的,对自定义的则会有下面红色线框的命名空间。res-aouto 表示自动查找,也可以使用自定义控件所持有的包名替代 res-auto
不使用declare-styleable 可以吗?
答案是可以的。<resources> <attr name="myText" format="string"/> <attr name="myColor" format="reference|color"/> </resources>
而普遍是这样的
<resources> <declare-styleable name="MyView"> <attr name="myText" format="string" /> <attr name="myColor" format="reference|color" /> </declare-styleable> </resources>
or
<resources> <!--定义属性--> <attr name="myText" format="string" /> <attr name="myColor" format="reference|color" /> <declare-styleable name="MyView"> <!--生成索引--> <attr name="myText" /> <attr name="myColor" /> </declare-styleable> </resources>
所有的资源文件在R中都会对应一个整型常量,并通过这个ID值能找到对应的资源文件。属性在R中对应的类是public static final class attr,如果我们写declare-styleable,就会在R文件中就会生成 对应的 styleable 类,这个类就是将每个控件的进行属性分组,然后记录属性的索引值。而TypedArray正好需要通过此索引值获取属性。如下图:
相关文章推荐
- 关于scrollview使用报错Exception raised during rendering: ScrollView can host only one direct child (Detail
- ScrollView can host only one direct child。
- 通过Android 源码分析ScrollView ‘ScrollView can host only one direct child’错误问题
- Android自定义View初识
- IOS之UI -- UITableView -- 1 -- 相关初识
- "ScrollView can host only one direct child"问题解决了
- ScrollView can host only one direct child
- Android 控制台异常:ScrollView can host only one direct child
- [置顶] RecycleView的基本配置和使用方法(一)---初识RecycleView
- 安卓初识基本控件_AutoCompleteTextView
- 自定义View 初识( 一)
- java.lang.IllegalStateException: ScrollView can host only one direct child
- 初识View-TWO
- UITableView初识(1)
- 【iOS开发-58】tableView初识:5个重要方法的使用和2种样式的区别
- 初识自定义view<一>
- 关于 This tag and its children can be replaced by one <TextView/> and a compound drawable 的问题
- 【Android学习笔记】This tag and its children can be replaced by one <TextView/> and a compound drawable
- ListView的新朋友-------RecyclerView初识
- UIProgressView-初识IOS