Android 图片Drawable类型之Layer List

层列表图像Layer List,可以使用多张图片合成一张图片,有点像PS中的图层叠加效果
语法:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list
        xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:drawable="@[package:]drawable/drawable_resource"
            android:id="@[+][package:]id/resource_name"
            android:top="dimension"
            android:right="dimension"
            android:bottom="dimension"
            android:left="dimension" />
    </layer-list>

一个item节点代表一张图片,当有多个item结点时,下面的item会叠加在上一个item之上
这里需要注意,如果在item只使用drawable设置图片,会导致底部图片拉伸填充整个容器

看下面的例子

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_launcher">
    </item>
    <item
        android:drawable="@drawable/ic_launcher"
        android:left="20dp"
        android:top="20dp"/>
    <item
        android:drawable="@drawable/ic_launcher"
        android:left="40dp"
        android:top="40dp"/>
</layer-list>

这里写图片描述
很明显的,在底下的图片都被拉伸了,为了避免这样的情况,可以给每个item添加gravity,并设置为center

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

这里写图片描述
官方给出的建议是添加Bitmap结点,并在bitmap里面设置gravity属性

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

效果是一样的

我们还可以利用layer list实现相框效果
这里写图片描述
layer_drawable布局

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--照片-->
    <item
        android:id="@+id/layer_photo"
        android:top="70dp"
        android:left="250dp"
        android:right="65dp"
        android:bottom="150dp"
        android:drawable="@drawable/image_one">
    </item>
    <!--相框-->
    <item
        android:drawable="@drawable/bg_photo_frame"/>
</layer-list>

里面的top、left、right、bottom都是计算好了的

Activity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:padding="10dp">

    <ImageView
        android:id="@+id/iv_photo_frame"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:src="@drawable/layer_drawable"/>
    <Button
        android:id="@+id/btn_change_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更换相片"/>
</LinearLayout>

主要代码

/**
 * Layer List
 * Created by zhuwentao on 2016-08-21.
 */
public class MainActivity extends AppCompatActivity {

    /* 更换相片 */
    private Button mChangePhotoBtn;

    /* 相册 */
    private ImageView mPhotoIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mChangePhotoBtn = (Button) findViewById(R.id.btn_change_photo);
        mPhotoIv = (ImageView) findViewById(R.id.iv_photo_frame);

        mChangePhotoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changePhoto();
            }
        });
    }

    /**
     * 替换图片
     */
    public void changePhoto() {
        LayerDrawable layerDrawable = (LayerDrawable) ContextCompat.getDrawable(this, R.drawable.layer_drawable);
        // 获取替换的图片
        Drawable drawable = ContextCompat.getDrawable(this, R.drawable.image_two);
        // 找到layer_drawable布局中需要更换的item,并替换成对应的图片
        layerDrawable.setDrawableByLayerId(R.id.layer_photo, drawable);
        mPhotoIv.setImageDrawable(layerDrawable);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值