android 基础 res文件 drawable

drawable中shape,selector,layer-list的使用

<shape>

用于设置控件的自身属性的效果形状,这些效果不会因为状态的改变而改变,比如圆形,圆角,边框效果等等。


<selector>

顾名思义就是选择器,所以使用Selector设置的是跟状态有关的效果,比如点击时,获取焦点时,选中时等所展现的控件效果。


<layer-list> 
用于控件效果的层叠。每一个item都可以实现独立的效果,比如shape或者selector,甚至item中也可以再包含一个layer-list。


有了总体概念,我们一一来分析各个drawable的使用格式:

一,<shape>属性

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
	android:shape="rectangle">
    <solid android:color="@android:color/holo_purple"/>
    <corners android:radius="20dp"/>
    <gradient
        android:centerColor="@android:color/holo_purple"
        android:endColor="@android:color/holo_blue_dark"
        android:startColor="@android:color/holo_blue_light"/>
</shape>

<shape>属性的设置比较中规中矩,没有什么特别好说的,只要你跟着属性设置规则走就行了。


<shape>常用属性如下:

<shape> android:shape=["rectangle" | "oval" | "line" | "ring"] 其中rectagle矩形,oval椭圆,line水平直线,ring环形
<shape>中子节点的常用属性:
	<gradient> 设置渐变
		android:startColor  起始颜色
		android:endColor  结束颜色 
		android:angle  渐变角度,0从左到右,90表示从下到上,数值为45的整数倍,默认为0;
		android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep

	<solid > 设置填充
		android:color  填充的颜色

  <stroke >描边
		android:width 描边的宽度
		android:color 描边的颜色
		android:dashWidth 表示'-'横线的宽度 虚线
		android:dashGap 表示'-'横线之间的距离 虚线

  <corners >圆角
		android:radius  圆角的半径 值越大角越圆
		android:topRightRadius 右上圆角半径
		android:bottomLeftRadius 右下圆角角半径
		android:topLeftRadius 左上圆角半径
		android:bottomRightRadius 左下圆角半径

  <padding >填充
		android:bottom="1.0dip"  底部填充
		android:left="1.0dip"  左边填充
		android:right="1.0dip" 右边填充
		android:top="0.0dip"  上面填充

shape取值有四种,可以是rectangle(长方形),oval(椭圆),line(线条),ring(圆环),如果设置的话默认是长方形,
只有当我们要画的图形是ring的时候,下面这几个属性才会生效:
android:innerRadius:内环的半径。
android:innerRadiusRatio:内环的比例,比如这个值为2,那么内环的半径就为环半径除以2,如果设置了第一个属性,则这个属性不起作用。
android:thickness:环的厚度。
android:thicknessRatio:环的厚度比例,比如这个值为2,那么环的厚度就为环半径除以2,如果设置了第三个属性,则这个属性不起作用。
android:useLevel:只有当我们的shape使用在LevelListDrawable中的时候,这个值为true,否则为false。


二,<selector>属性

在drawable中配置Android的selector。
<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android" >  
    <!-- 默认情况,item必须放在最后 -->  
      
    <!-- 非触摸模式下获得焦点并单击时的背景图片 -->  
    <item   
        android:state_focused="true"  
        android:state_pressed="true"  
        android:drawable="@drawable/ic_launcher"  
        />  
    <!-- 触摸模式下单击时的背景图片-->  
    <item   
        android:state_focused="false"  
        android:state_pressed="true"  
        android:drawable="@drawable/ic_launcher"  
        />  
    <!--选中时的图片背景-->  
    <item   
        android:state_selected="true"  
        android:drawable="@drawable/ic_launcher"  
        />  
    <!--获得焦点时的图片背景-->  
    <item   
        android:state_focused="true"  
        android:drawable="@drawable/ic_launcher"  
        />  
    <item   
        android:drawable="@drawable/button_bg_default"  
        />  
</selector>  


第一种方法是在listview配置文件中配置,代码如下:android:listSelector="@drawable/item_bg"
第二种方法是在listview的item中添加属性,代码如下:android:background=“@drawable/item_bg"
第三种方法是在java代码中设置,代码如下:Drawable drawable =getResources().getDrawable(R.drawable.item_bg); ListView.setSelector(drawable);
上面的设置方法显示效果有时候为黑,所以需要在配置文件上加上如下代码:android:cacheColorHint="@android:color/transparent" 使其背景是透明的。


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 当前窗口失去焦点时 -->
    <item android:drawable="@drawable/bg_btn_lost_window_focused" android:state_window_focused="false" />
    <!-- 不可用时 -->
    <item android:drawable="@drawable/bg_btn_disable" android:state_enabled="false" />
    <!-- 按压时 -->
    <item android:drawable="@drawable/bg_btn_pressed" android:state_pressed="true" />
    <!-- 被选中时 -->
    <item android:drawable="@drawable/bg_btn_selected" android:state_selected="true" />
    <!-- 被激活时 -->
    <item android:drawable="@drawable/bg_btn_activated" android:state_activated="true" />
    <!-- 默认时 -->
    <item android:drawable="@drawable/bg_btn_normal" />
</selector>




三,<layer-list>属性

将多个图片或上面两种效果按照顺序层叠起来
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@android:color/holo_red_light" />
        </shape>
    </item>

    <item
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/background_light" />
        </shape>
    </item>

    <item>
        <selector>
            <item android:state_pressed="true">
                <transition
                    android:opacity="transparent"
                    android:paddingBottom="30dp"
                    android:paddingLeft="10dp">
                    <item android:drawable="@android:drawable/ic_delete" />
                </transition>
            </item>

            <item android:state_selected="false">
                <animated-rotate
                    android:drawable="@android:drawable/dark_header"
                    android:pivotX="30%"
                    android:pivotY="70%"
                    android:visible="true" />
            </item>
        </selector>
    </item>
</layer-list>

ayer-list就更加灵活了,每一个item都是独立存在的,都可以独当一面,然后item可以包含任何的上面所说的效果设置!当然也包括layer-list自己本身。
而item自身的属性中有各种left,gravity,width等属性跟我们平时在布局文件中使用的是一个意思,只是这次的对象是那些drawable图层罢了。
最后要注意的是由于是层叠效果,所以后面的总是覆盖前面的。就比如上面的例子,如果把selector的属性挪到前面,那么动画就会被挡住。


selector 和 layer-list 结合


实现选项卡的效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 第一种加载方式 -->
    <!--<item android:drawable="@drawable/bg_tab_selected" android:state_checked="true" />-->
    <!-- 第二种加载方式 -->
    <item android:state_checked="true">
        <layer-list>
            <!-- 红色背景 -->
            <item>
                <color android:color="#E4007F" />
            </item>
            <!-- 白色背景 -->
            <item android:bottom="4dp" android:drawable="@android:color/white" />
        </layer-list>
    </item>
    <item>
        <layer-list>
            <!-- 红色背景 -->
            <item>
                <color android:color="#E4007F" />
            </item>
            <!-- 白色背景 -->
            <item android:bottom="1dp" android:drawable="@android:color/white" />
        </layer-list>
    </item>
</selector>

以下是带阴影的圆角矩形:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 灰色阴影 -->
    <item
        android:left="2dp"
        android:top="4dp">
        <shape>
            <solid android:color="@android:color/darker_gray" />
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- 白色前景 -->
    <item
        android:bottom="4dp"
        android:right="2dp">
        <shape>
            <solid android:color="#FFFFFF" />
            <corners android:radius="10dp" />
        </shape>
    </item>
</layer-list>

猜你喜欢

转载自blog.csdn.net/l331258747/article/details/52875268