Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解

本文深入探讨了Android中View状态背景切换的原理,详细解析了StateListDrawable的使用,包括如何根据View的不同状态(如selected、focused)显示不同背景图片。文章还介绍了View的状态改变如何触发背景更新,以及涉及到的关键方法如refreshDrawableState()、drawableStateChanged()和setState()。通过示例代码展示了如何自定义View以实现状态背景动态变化。
摘要由CSDN通过智能技术生成
  1. stalistDrawable.addState(new int []{selected }, getResources().getDrawable(R.drawable.pic3);

  2. stalistDrawable.addState(new int []{focused }, getResources().getDrawable(R.drawable.pic4);

  3. //没有任何状态时显示的图片,我们给它设置我空集合

  4. stalistDrawable.addState(new int []{}, getResources().getDrawable(R.drawable.pic5);

上面的“-”负号表示对应的属性值为false

当我们为某个View使用其作为背景色时,会根据状态进行背景图的转换。

public boolean isStateful ()

功能: 表明该状态改变了,对应的drawable图片是否会改变。

注:在StateListDrawable类中,该方法返回为true,显然状态改变后,我们的图片会跟着改变。

知识点二:View的五种状态值

一般来说,Android框架为View定义了四种不同的状态,这些状态值的改变会引发View相关操作,例如:更换背景图片、是否

触发点击事件等;视

视图几种不同状态含义见下图:

其中selected和focused的区别有如下几点:

1,我们通过查看setSelected()方法,来获取相关信息。

SDK中对setSelected()方法----对于与selected状态有如下说明:

public void setSelected (boolean selected)

Since: APILevel 1

Changes the selection state of this view. Aview can be selected or not. Note that selection is not the same as

focus. Views are typically selected in the context of an AdapterView like ListView or GridView ;the selected view is

the view that is highlighted.

Parameters selected   true if the view must be selected, false otherwise

由以上可知:selected不同于focus状态,通常在AdapterView类群下例如ListView或者GridView会使某个View处于

selected状态,并且获得该状态的View处于高亮状态。

2、一个窗口只能有一个视图获得焦点(focus),而一个窗口可以有多个视图处于”selected”状态中。

总结:focused状态一般是由按键操作引起的;

pressed状态是由触摸消息引起的;

selected则完全是由应用程序主动调用setSelected()进行控制。

例如:当我们触摸某个控件时,会导致pressed状态改变;获得焦点时,会导致focus状态变化。于是,我们可以通过这种

更新后状态值去更新我们对应的Drawable对象了。

问题:如何根据状态值的改变去绘制/显示对应的背景图?

当View任何状态值发生改变时,都会调用refreshDrawableList()方法去更新对应的背景Drawable对象。

其整体调用流程如下: View.jav

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

a类中

[java]  view plain copy print ?

  1. //路径:\frameworks\base\core\java\android\view\View.java

  2. /* Call this to force a view to update its drawable state. This will cause

  3. * drawableStateChanged to be called on this view. Views that are interested

  4. * in the new state should call getDrawableState.

  5. */

  6. //主要功能是根据当前的状态值去更换对应的背景Drawable对象

  7. public void refreshDrawableState() {

  8. mPrivateFlags |= DRAWABLE_STATE_DIRTY;

  9. //所有功能在这个函数里去完成

  10. drawa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值