Android学习之layer-list

来源:互联网 发布:java多行注释快捷键 编辑:程序博客网 时间:2024/06/06 04:16

layer-list

layer是层,list是列表,那么layer-list是层列表的意思。其实layer-list是用来创建LayerDrawablede,LayerDrawable是DrawableResource的一种,所以layer-list创建出来的是图层列表,也就是一个drawable图形

作用:

layer-list是用来创建图层列表,通过它能创建出一些特殊的drawable。
比如:

下图的AlertDialog中,我们只需要设置button的顶部边线,以及左侧button的右边线,这种时候我们无法直接使用shape,因为直接使用shape绘制出来的是四个边框,如果让美工切图也可以,但是不灵活,而且会增加App的体积。这种情况下,layer-list是最佳选择。
这里写图片描述

原理
layer-list的大致原理类似RelativeLayout(或者FrameLayout),也是一层层的叠加,后添加的会覆盖先添加的。在layer-list中可以通过控制后添加的图层距离最底部图层额上下左右的四个边距等属性,得到不同的效果

上面实例图中,AlertDialog 底部的 ok按钮 的背景就是用layer-list实现的。该layer-list 中,底层使用一个填充色为蓝色 的shape,上层使用一个填充色为白色的shape ,然后控制上层距离最底层的顶部边距为1dp , 这样在视觉上就形成了一个 具有蓝色顶部边线的白色背景。具体代码继续往下看。

例子:
因 layer-list 创建出来的也是 drawable 资源,所以,同 shape selector 一样,都是定义在 res 中的 drawable 文件夹中,也是一个 xml 文件。使用的时候,同shape selector , 布局文件中使用 @drawable/ xxx 引用, 代码中使用 R.drawable.xxx 引用。

layer-list 中不同的图层使用 item 节点来定义。

(1)单一边线:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <shape>            <solid android:color="#02a0ef"/>        </shape>    </item>    <item android:top="1dp">        <shape>            <solid android:color="#fff"/>        </shape>    </item></layer-list> <TextView        android:layout_width="match_parent"        android:layout_height="40dp"        android:text="Hello World!"        android:background="@drawable/singleline"        android:gravity="center"        />

效果:
这里写图片描述

(2)双边线:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <shape>            <solid android:color="#02a0ef"/>        </shape>    </item>    <item android:top="1dp"        android:bottom="1dp"        >        <shape>            <solid android:color="#fff"/>        </shape>    </item></layer-list>

效果:
这里写图片描述

(3)阴影:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <!--底层的左边距离上层左边3dp, 底层的顶部,距离上层的顶部6dp -->   <item  android:left="3dp"          android:top="6dp"       >       <shape>            <solid   android:color="#b4b5b6"/>       </shape>   </item>    <item android:bottom="6dp"        android:right="3dp"        >        <shape>            <solid android:color="#fff"/>        </shape>    </item></layer-list> <TextView        android:layout_width="match_parent"        android:layout_height="70dp"        android:text="Hello World!"        android:layout_marginTop="10dp"        android:background="@drawable/yinying"        android:gravity="center"

效果:
这里写图片描述

(4)图片层叠:
图片层叠的时候,有两种效果,一种是缩放后层叠,一种是不缩放的层叠。默认是缩放效果
1.带缩放的:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <bitmap android:src="@drawable/angrybirds"/>    </item>    <item android:left="35dp"        android:top="35dp">        <bitmap android:src="@drawable/angrybirds"/>    </item>    <item android:left="70dp"        android:top="70dp"        >        <bitmap android:src="@drawable/angrybirds"/>    </item></layer-list>或者:<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <!--这种方式拿到的是带有缩放的效果,即便给item 设置了gravity 并且从模拟器上看到的效果是不缩放的,但是真机上依旧是缩放的效果-->    <item>        <bitmap android:src="@drawable/angrybirds"/>    </item>    <item android:left="35dp"        android:top="35dp">        <bitmap android:src="@drawable/angrybirds"/>    </item>    <item android:left="70dp"        android:top="70dp"        >        <bitmap android:src="@drawable/angrybirds"/>    </item></layer-list> <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/suofang2"        />

效果:
这里写图片描述

2.不带缩放的:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <bitmap android:src="@drawable/angrybirds"            android:gravity="center"            />    </item>    <item  android:left="35dp"        android:top="35dp"        >        <bitmap android:src="@drawable/angrybirds"            android:gravity="center"            />    </item>    <item android:left="70dp"        android:top="70dp">        <bitmap android:src="@drawable/angrybirds"            android:gravity="center"            />    </item></layer-list>

效果:
这里写图片描述

注意:
A. 不缩放的时候,必须在 item 节点中使用 bitmap 节点,并给 bitmap 设置 gravity=center ;
B. 虽然在实现缩放效果的时候,可以直接使用 item 中的 drawable属性,但实现不缩放的效果时,如果还用drawable 属性,即便给item 设置了gravity =center ,在真机上的效果依旧是缩放的。(但模拟器是不缩放的)

(5)叠加旋转:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <rotate android:fromDegrees="-20"            android:pivotX="0"            android:pivotY="0">            <bitmap android:src="@drawable/kapian"/>        </rotate>    </item>    <item>        <rotate android:fromDegrees="20"            android:pivotY="0"            android:pivotX="0">            <bitmap android:src="@drawable/kapian"/>        </rotate>    </item>    <item>        <rotate            android:fromDegrees="40"            android:pivotX="0"            android:pivotY="0"            >            <bitmap android:src="@drawable/kapian"/>        </rotate>    </item></layer-list>

效果:
这里写图片描述

旋转的时候,只需要给出 起始的角度( fromdegress )即可。

layer-list的扩展使用

现实选择器的效果:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_checked="true">        <layer-list>            <item>                <shape>                    <solid android:color="#f00"/>                </shape>            </item>            <item android:bottom="4dp">            <shape>                <solid android:color="#fff"/>            </shape>            </item>        </layer-list>    </item>    <item>        <layer-list>            <item>                <shape>                    <solid android:color="#f00"/>                </shape>            </item>            <item android:bottom="2dp">                <shape>                    <solid android:color="#fff"/>                </shape>            </item>        </layer-list>    </item></selector> <RadioGroup        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal"        android:id="@+id/rg"        >        <RadioButton            android:layout_width="0dp"            android:id="@+id/rg1"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/selcet"            android:checked="true"            android:gravity="center"            android:padding="10dp"            android:text="第一个"            android:button="@null"            />        <RadioButton            android:layout_width="0dp"            android:layout_height="wrap_content"            android:id="@+id/rg2"            android:layout_weight="1"            android:background="@drawable/selcet"            android:checked="true"            android:gravity="center"            android:padding="10dp"            android:text="第二个"            android:button="@null"            />        <RadioButton            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:id="@+id/rg3"            android:background="@drawable/selcet"            android:checked="true"            android:gravity="center"            android:padding="10dp"            android:text="第三个"            android:button="@null"            />    </RadioGroup>

效果:
这里写图片描述

注意:
在 RadioGroup 中,是通过 RadioButton 的 id 来控制是否选中。
所以,如果需要设置某一个 RadioButton 为默认选中,就必须给该 RadioButton 设置 id ;
如果不设置 id ,导致的结果就是该 RadioButton 会一直处于选中状态!!!

原创粉丝点击