目录

1.view的状态都有哪几种?
<https://blog.csdn.net/geduo_83/article/details/86694828#1.view%E7%9A%84%E7%8A%B6%E6%80%81%E9%83%BD%E6%9C%89%E5%93%AA%E5%87%A0%E7%A7%8D%EF%BC%9F>

2.invalidate和requestLayout相同点和不同点?
<https://blog.csdn.net/geduo_83/article/details/86694828#2.invalidate%E5%92%8CrequestLayout%E7%9B%B8%E5%90%8C%E7%82%B9%E5%92%8C%E4%B8%8D%E5%90%8C%E7%82%B9%EF%BC%9F>

1.view的状态都有哪几种?

视图状态的种类非常多,一共有十几种类型,不过多数情况下我们只会使用到其中的几种,因此这里我们也就只去分析最常用的几种视图状态。

* 1.1 enabled

表示当前视图是否可用。可以调用setEnable()方法来改变视图的可用状态,传入true表示可用,传入false表示不可用。它们之间最大的区别在于,不可用的视图是无法响应onTouch事件的。

* 1.2 focused

表示当前视图是否获得到焦点。通常情况下有两种方法可以让视图获得焦点,即通过键盘的上下左右键切换视图,以及调用requestFocus()方法。而现在的Android手机几乎都没有键盘了,因此基本上只可以使用requestFocus()这个办法来让视图获得焦点了。而requestFocus()方法也不能保证一定可以让视图获得焦点,它会有一个布尔值的返回值,如果返回true说明获得焦点成功,返回false说明获得焦点失败。一般只有视图在focusable和focusable
in touch mode同时成立的情况下才能成功获取焦点,比如说EditText。

* 1.3 window_focused
表示当前视图是否处于正在交互的窗口中,这个值由系统自动决定,应用程序不能进行改变。

* 1.4 selected

表示当前视图是否处于选中状态。一个界面当中可以有多个视图处于选中状态,调用setSelected()方法能够改变视图的选中状态,传入true表示选中,传入false表示未选中。

* 1.5 pressed

表示当前视图是否处于按下状态。可以调用setPressed()方法来对这一状态进行改变,传入true表示按下,传入false表示未按下。通常情况下这个状态都是由系统自动赋值的,但开发者也可以自己调用这个方法来进行改变。


我们可以在项目的drawable目录下创建一个selector文件,在这里配置每种状态下视图对应的背景图片。比如创建一个compose_bg.xml文件,在里面编写如下代码:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item
android:drawable="@drawable/compose_pressed"
android:state_pressed="true"></item> <item
android:drawable="@drawable/compose_pressed"
android:state_focused="true"></item> <item
android:drawable="@drawable/compose_normal"></item> </selector>
2.invalidate和requestLayout相同点和不同点?

* invalidate会导致onDraw重新被调用
* RequestLayout则会导致onMeasure、onLayout、onDraw都会重新调用一遍