Android开发中的drawable文件:shape、layer-list和selector标签

Shape:定义的几何形状的标签

属性:

 

android:shape  这是标签的主要属性,可以定义shape的形状,可以设置成:rectagle矩形,oval椭圆,line水平直线,ring环形


子标签包括: 渐变、   填充、   描边、   圆角、  内补偿

shape的颜色渐变效果

android:startColor 起始颜色

android:endColor  结束颜色          

android:angle  渐变角度,比如说从白变到黑。是从上向下变到黑还是从左到右变到黑或者是斜着变?就是由这个属性控制的

android:type  渐变的样式 liner线性渐变 radial环形渐变sweep

shape的内部填充效果

android:color  填充的颜色这里设置的颜色将会填充到shape内部的所有区域

shape的边缘线效果

android:width 边缘线的宽度

android:color 边缘线的颜色

android:dashWidth 边缘线用虚线,形如“- - - - - - - --”这样的形式。这个属性表示“-”小元素的宽度

android:dashGap边缘线用虚线,形如“- - - - - - - --”这样的形式。这个属性表示“-”小元素之间的间隔距离

shape的棱角圆弧效果(如果不设置该标签,将会默认为尖角效果

android:radius  圆角的半径

android:topRightRadius 右上圆角半径

android:bottomLeftRadius 右下圆角角半径

android:topLeftRadius 左上圆角半径

android:bottomRightRadius 左下圆角半径

shape的内补偿距离,也就是shape的内部填充物(比如颜色或者图片)距离shape的边缘的距离

android:bottom 底部补偿

android:left 左边补偿

android:right 右边补偿

android:top 上面补偿

layer-list将多个元素按照顺序逐层叠加

如下例子:


         
    
    
        
    



Selector:选择器,内置开发者自己定义的,系统会根据组件的状态选择相应的来呈现。
直接这样解释可能不太好理解,举个例子来说明一下吧:

布局文件中有如下代码:

  --------------注释1
        

my_selector.xml文件:



 ----------------注释2
 ---------------注释3

 上述例子中 
  image_view的注释1处声明了ImageView的呈现资源是my_selector.xml文件的内容。而在my_selector.xml文件中又声明了两种呈现:1.在按压状态下展示picture1这种图片;2.在默认状态下展示picture2这种图片。 
  

那么当程序跑起来的时候image_view首先展示的是注释3处的picture2这张默认图,当用户触摸image_view时,image_view会处于pressed状态,这是my_selector就会选择注释2出的,呈现picture1了。

标签的基础状态属性有如下:

android:state_selected  是否选中

android:state_focused  是否获得了焦点

android:state_pressed  是否被按下

android:state_enabled  是否可用

在实际应用中,不止存在以上这几种状态,还有很多由上述状态组合起来的复合状态,如下例子:
           
         
          
            
          
           
          
         
          
          
          
           
          
           
       

以上例子就是一些复合状态的举例。但这个selector是绝对不可用的,这里需要开发者额外注意一下,下面来分析原因:

系统在selector寻找符合要求的item时是按照代码的顺序从上向下遍历的,一旦发现符合状态的item就直接使用它,并停止继续寻找!所以比如把

这样的item放在第一位的话,那在系统寻找item时,遍历到这个item,它没有指定特殊状态,必然符合状态要求(可以理解为万能钥匙),所以就会直接使用这个item而不再继续向下遍历了。

所以开发者在布置时要注意一下:如果把这些状态理解成集合的话,那么位于下面的集合一定不要是上面某个集合的子集,否则是不会轮到下面这个集合出场的。




你可能感兴趣的:(Android)