droid setSelected及view相关知识

droid setSelected及view相关知识


                                                                                          本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 


      今天继续给大家分享下View的相关知识,重点有一下两点:


           1、View的几种不同状态属性

           2、如何根据不同状态去切换我们的背景图片。

 

 

开篇介绍:android背景选择器selector用法汇总


        对Android开发有经验的同学,对 <selector>节点的使用一定很熟悉,该节点的作用就是定义一组状态资源图片,使其能够

  在不同的状态下更换某个View的背景图片。例如,如下的hello_selection.xml文件定义:

[java] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8" ?>     
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">   
  3.   <!-- 触摸时并且当前窗口处于交互状态 -->    
  4.   <item android:state_pressed="true" android:state_window_focused="true" android:drawable= "@drawable/pic1" />  
  5.   <!--  触摸时并且没有获得焦点状态 -->    
  6.   <item android:state_pressed="true" android:state_focused="false" android:drawable="@drawable/pic2" />    
  7.   <!--选中时的图片背景-->    
  8.   <item android:state_selected="true" android:drawable="@drawable/pic3" />     
  9.   <!--获得焦点时的图片背景-->    
  10.   <item android:state_focused="true" android:drawable="@drawable/pic4" />    
  11.   <!-- 窗口没有处于交互时的背景图片 -->    
  12.   <item android:drawable="@drawable/pic5" />   
  13. </selector>  

           更多关于 <selector>节点的使用请参考该博客<android背景选择器selector用法汇总>


       其实,前面说的xml文件,最终会被Android框架解析成StateListDrawable类对象。

 

 

知识点一:StateListDrawable类介绍


    类功能说明:该类定义了不同状态值下与之对应的图片资源,即我们可以利用该类保存多种状态值,多种图片资源。

    常用方法为:

       public void addState (int[] stateSet, Drawable drawable)

       功能: 给特定的状态集合设置drawable图片资源

       使用方式:参考前面的hello_selection.xml文件我们利用代码去构建一个相同的StateListDrawable类对象,如下:

[java] view plaincopyprint?
  1. //初始化一个空对象  
  2. StateListDrawable stalistDrawable = new StateListDrawable();  
  3. //获取对应的属性值 Android框架自带的属性 attr  
  4. int pressed = android.R.attr.state_pressed;  
  5. int window_focused = android.R.attr.state_window_focused;  
  6. int focused = android.R.attr.state_focused;  
  7. int selected = android.R.attr.state_selected;  
  8.   
  9. stalistDrawable.addState(new int []{pressed , window_focused}, getResources().getDrawable(R.drawable.pic1));  
  10. stalistDrawable.addState(new int []{pressed , -focused}, getResources().getDrawable(R.drawable.pic2);  
  11. stalistDrawable.addState(new int []{selected }, getResources().getDrawable(R.drawable.pic3);  
  12. stalistDrawable.addState(new int []{focused }, getResources().getDrawable(R.drawable.pic4);  
  13. //没有任何状态时显示的图片,我们给它设置我空集合  
  14. 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.java类中

[java] view plaincopyprint?
  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.         drawableStateChanged();  
  11.         ...  
  12.     }  
  13.     /* This function is called whenever the state of the view changes in such 
  14.      * a way that it impacts the state of drawables being shown. 
  15.      */  
  16.     // 获得当前的状态属性--- 整型集合 ; 调用Drawable类的setState方法去获取资源。  
  17.     protected void drawableStateChanged() {  
  18.         //该视图对应的Drawable对象,通常对应于StateListDrawable类对象  
  19.         Drawable d = mBGDrawable;     
  20.         if (d != null && d.isStateful()) {  //通常都是成立的  
  21.             //getDrawableState()方法主要功能:会根据当前View的状态属性值,将其转换为一个整型集合  
  22.             //setState()方法主要功能:根据当前的获取到的状态,更新对应状态下的Drawable对象。  
  23.             d.setState(getDrawableState());  
  24.         }  
  25.     }  
  26.     /*Return an array of resource IDs of the drawable states representing the 
  27.      * current state of the view. 
  28.      */  
  29.     public final int[] getDrawableState() {  
  30.         if ((mDrawableState != null) && ((mPrivateFlags & DRAWABLE_STATE_DIRTY) == 0<


关键词:

文章点评:


精选专题
Laravel入门教程

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

hadoop学习及应用

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。 Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

互联网产品设计

产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计

产品经理职责

随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责

最新专题

  • 01/ 04月
    android游戏开发教程
  • 01/ 04月
    webos手机
  • 01/ 04月
    重庆ios培训
  • 01/ 04月
    ios开发教程
  • 01/ 04月
    android应用开发实战

IThao123周刊

  • 14/ 09月
    IThao123互联网周刊,互联网资讯不错...
  • 08/ 09月
    IThao123互联网周刊,互联网资讯不错...
  • 02/ 09月
    IThao123互联网周刊,互联网资讯不错过(...
  • 26/ 08月
    IThao123互联网周刊,互联网资讯不错...
  • 17/ 08月
    IThao123互联网周刊,互联网资讯不错过(...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值