android中shape,selector,layer-list的使用小结

在android日常开发中,使用自定义drawable文件夹,使用shape,selector,layer-list绘制出drawable文件进行应用是十分常见的。需要稍微总结下:

1、shape的使用
顾名思义shape是形状的意思,就是android中提供的自定义绘制drawable形状的一个机制,我跟ios讨论过,他们没有这个,嘿嘿黑,顿时觉得很方便有木有。


<shape xmlns:android="http://schemas.android.com/apk/res/android"   android:shape="rectangle"
    <corners
        --四个角的弧度 -->
        android:radius="10dp"
        
        android:topLeftRadius="2dp" 
        android:topRightRadius="2dp"
        android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"/>

    
    <gradient
         -- 开始渐变 -->
        android:startColor="@android:color/white"
         
        android:centerColor="@android:color/blue"
         
        android:endColor="@android:color/black"
        android:useLevel="true"
        
        android:type="linear"
         
        android:angle="45"
         
        android:type="radial"
        
        android:centerX="0"
        android:centerY="0"
         
        android:gradientRadius="90"/>

    
    <padding
        android:left="2dp"
        android:top="2dp"
        android:right="2dp"
        android:bottom="2dp"/>

    
    <size
        android:width="50dp"
        android:height="50dp"/>

    
    <solid
        android:color="@android:color/white"/>

    
    <stroke
        android:width="2dp"
        android:color="@android:color/black"
         -- 默认为0,虚线的宽度,0即为实线 -->
        android:dashWidth="1dp" 
         
        android:dashGap="2dp"/>
  

shape>

2、selector的使用
selector顾名思义就是选择的意思。多用在切换状态时候,切换drawable或者文字颜色。

     
<selector xmlns:android="http://schemas.android.com/apk/res/android">   
    
  <item android:drawable="@drawable/defaultimg" />      
    
  <item android:state_window_focused="false"     
        android:drawable="@drawable/defaultimg" />     
    
  <item android:state_focused="true"     android:state_pressed="true"  
  android:drawable= "@drawable/defaultimg2" />   
    
<item android:state_focused="false" android:state_pressed="true"   android:drawable="@drawable/defaultimg3" />    
    
  <item android:state_selected="true"   android:drawable="@drawable/defaultimg4" />     
    
  <item android:state_focused="true"   android:drawable="@drawable/defaultimg5" />  
  
   <item android:state_checked="true" android:drawable="@drawable/addselect"/>
selector> 

是不是很方便,我们直接在写xml文件就可以定义好按钮的状态。是不是再也不用考虑在java代码中切换那些样式了。对了,这个ios的也没有哟哟哟

3、layer-list的使用

其实就是个数据集合,可以作为adapter的数据集,当然可以实现两张图片的叠加。看下进度条中的源码也是通过layer-list来实现的 style=”@android:style/Widget.ProgressBar.Horizontal”:

这里写图片描述

主要是这一句
@drawable/progress_horizontal

看下源码:




<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
            />
        shape>
    item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                />
            shape>
        clip>
    item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                />
            shape>
        clip>
    item>

layer-list>

总结:可以看到的是,这里也是用layer-list实现两张图片的叠加来实现进度条的效果。

那么我们自定义水平进度条的样式,嘿嘿黑,其实很简单。

这里写图片描述

1、进度条的xml,用自己的style

 <ProgressBar
                android:id="@+id/progress_count"
                style="@style/mProgress_horizontal"
                android:layout_width="match_parent"
                android:layout_height="45px"
                android:layout_marginLeft="40px"
                android:layout_marginRight="40px"
                android:progress="0"
                android:secondaryProgress="10" />

2、其实你看出来了,那个style是重点,用自己的”android:progressDrawable”

3、是的,就是这个layer-list,我们复制源码,改下颜色。是的,你只需要替换下item为图片或者,你完全只需要改成你心仪的色值。


<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="@color/linecolor"
                android:centerColor="@color/textcolorgray"
                android:centerY="0.75"
                android:endColor="@color/textcolorgray"
                android:angle="270"
                />
        shape>
    item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:startColor="@color/blue"
                    android:centerColor="@color/blue"
                    android:centerY="0.75"
                    android:endColor="@color/blue"
                    android:angle="270"
                    />
            shape>
        clip>
    item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:startColor="@color/blue"
                    android:centerColor="@color/blue"
                    android:centerY="0.75"
                    android:endColor="@color/blue"
                    android:angle="270"
                    />
            shape>
        clip>
    item>


layer-list>

4、还有呢?目前就用到这些,当做笔记记录下来,以备不时之需,如果你有更多的使用场景或者需要加入进来的标签,欢迎拍砖~我的内心是欣喜的,因为ios那边不能使用这些便捷的标签。当然我们可以想象使用java进行这些例如背景颜色,虚线等的自定义。不过,这是最便捷的方法了~

你可能感兴趣的:(android路)