zoukankan      html  css  js  c++  java
  • Android-Drawable

    Android-Drawable

    学习自: KEEGAN小钢 原文链接:https://keeganlee.me/post/android/20150916

    官方文档: https://developer.android.google.cn/guide/topics/resources/drawable-resource#top_of_page

    Drawable 指的是一种可绘制图像,但又不只是图片。可以是一种颜色或者各种形状所组成的图形。Drawable 一般做背景显示。一般通过XML来编写,也可以通过代码来写。

    优点:占用空间小,减小APK 体积,能够更好的适配各种机型显示。

    1.Bitmap (位图)

    通过Bitmap 可以对图片进行一些设置,

    属性 描述
    src 指定图片资源(必须指定)
    tint 给图片着色(更换颜色)
    gravity 对齐方式
    antialias 是否开启抗锯齿
    filter 当对图片进行收缩或者延展后可以获得更平滑的效果
    tileMode 平铺方式
    • android:tileMode 平铺方式,

      四个可选值: repeat,mirror,clamp(复制图片边缘颜色来填充剩余部分),disable(默认,没效果)

      效果图:

    2.九宫格

    能够对png图片进行局部拉伸,创建方式右键一张png图片,选择 Create 9-Patch file...

    操作方式:通过拖动黑线区域来指定可拉伸区域,交叉位置即为可拉伸区域(也是文本显示位置)。

    效果图:

    3.Inset (插入可绘制对象)

    对Drawable 设置内边距,也可以对单个方向进行设置。

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:drawable="@drawable/img1"
        android:inset="10dp"
        android:insetBottom="5dp"
        android:insetLeft="5dp"
        android:insetRight="5dp"
        android:insetTop="5dp" />
    

    效果图:

    4.Clip (裁剪可绘制对象)

    对Drawable 进行裁剪,通过设置level值控制裁剪多少,level 取值范围 0~10000,默认0,也就是图片完全不显示。

    实用场景:进度条

    android:gravity

    设置裁剪的位置,可取值如下,多个取值用 | 分隔:

    • top 图片放于容器顶部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片底部
    • bottom 图片放于容器底部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片顶部
    • left 图片放于容器左边,不改变图片大小,默认值。当裁剪方向为horizontal,会裁掉图片右边部分
    • right 图片放于容器右边,不改变图片大小。当裁剪方向为horizontal,会裁掉图片左边部分
    • center 图片放于容器中心位置,包括水平和垂直方向,不改变图片大小。当裁剪方向为horizontal时,会裁掉图片左右部分;当裁剪方向为vertical时,会裁掉图片上下部分
    • fill 拉伸整张图片以填满容器的整个高度和宽度。这时候图片不会被裁剪,除非level设为了0,此时图片不可见
    • center_vertical 图片放于容器垂直方向的中心位置,不改变图片大小。裁剪和center时一样
    • center_horizontal 图片放于容器水平方向的中心位置,不改变图片大小。裁剪和center时一样
    • fill_vertical 在垂直方向上拉伸图片以填满容器的整个高度。当裁剪方向为vertical时,图片不会被裁剪,除非level设为了0,此时图片不可见
    • fill_horizontal 在水平方向上拉伸图片以填满容器的整个宽度。当裁剪方向为horizontal时,图片不会被裁剪,除非level设为了0,此时图片不可见
    • clip_vertical 附加选项,裁剪基于垂直方向的gravity设置,设置top时会裁剪底部,设置bottom时会裁剪顶部,其他情况会同时裁剪顶部和底部
    • clip_horizontal 附加选项,裁剪基于水平方向的gravity设置,设置left时会裁剪右侧,设置right时会裁剪左侧,其他情况会同时裁剪左右两侧

    Style1:

    <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:clipOrientation="horizontal"
        android:drawable="@drawable/img1"
        android:gravity="left"/>
    

    Style2: 也可以在其中定义 drawable类型的子标签

    <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:clipOrientation="horizontal"
        android:gravity="left">
        <color android:color="@color/colorPrimary" />
    </clip>
    

    从0~10000效果图:

    代码设置 level:

    Scaleiv.drawable.level = progress
    

    5.Scale (缩放可绘制对象)

    对Drawable 进行缩放操作,通过设置 level 来控制缩放比例,level 越高越接近原图。范围0~10000

    属性 描述
    drawable 指定drawable 资源
    scaleHeight 设置可缩放高度的最大百分比,也就是说最小能够缩小到原图的百分之多少
    scaleWidth 设置可缩放宽度的最大百分比,也就是说最小能够缩小到原图的百分之多少
    scaleGravity 缩放后图片位置
    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:drawable="@drawable/img2"
        android:scaleGravity="center"
        android:scaleHeight="50%"
        android:scaleWidth="50%" />
    

    需要通过代码设置level

    从0到10000的变化,最小图是原图的50%

    6.level-list (级别列表)

    将多个drawable 放到一个集合中,更具设置level 来显示不同drawable

    item 匹配规则是从上到下,只要匹配就会返回,不会继续往下走。

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/img1"
            android:maxLevel="50"
            android:minLevel="0" />
        <item
            android:drawable="@drawable/img2"
            android:maxLevel="100"
            android:minLevel="51" />
    </level-list>
    

    一般情况下,每个item按照maxLevel从小到大添加,如下:

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/battery_low"
            android:maxLevel="10" />
        <item
            android:drawable="@drawable/battery_below_half"
            android:maxLevel="50" />
        <item
            android:drawable="@drawable/battery_over_half"
            android:maxLevel="99" />
        <item
            android:drawable="@drawable/battery_full"
            android:maxLevel="100" />
    </level-list>
    

    7.Transition (转换可绘制对象)

    Transition 继承自 layer-list, 但是transition 只能添加两个drawable,提供了两个drawable切换的方法,切换时会有淡入淡出效果。

    应用场景:开关背景图

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/img1" />
        <item android:drawable="@drawable/img2" />
    </transition>
    

    切换代码:

    var td = iv_temp.drawable as TransitionDrawable
                     //动画时长
    td.startTransition(1000) //正向切换,第一张到第二张 (只能实现第一张到第二张)
    td.reverseTransition(1000) //逆向切换,第二张到第一张 (可以实现两张来回切换)
    

    8.Rotate

    对drawable 进行旋转

    应用场景:上箭头图片显示为下箭头图片

    属性 描述
    fromDegrees 起始角度度数
    toDegrees 结束角度度数(正数表示顺时针,负数表示逆时针)
    pivoX 旋转中心X坐标,百分比表示,相对于左边缘距离
    pivoY 旋转中心X坐标,百分比表示,相对于上边缘距离
    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/img2"
        android:fromDegrees="0"
        android:pivotX="5%"
        android:pivotY="50%"
        android:toDegrees="180" />
    

    效果图:

    9.Animation-list

    创建帧动画,将多张drawable按照一定的播放顺序和一定的播放时间间隔来播放。

    oneshot: 是否是播放一次 duration:播放时间间隔

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
    
        <item
            android:drawable="@drawable/img_miao1"
            android:duration="80" />
        <item
            android:drawable="@drawable/img_miao2"
            android:duration="80" />
        <item
            android:drawable="@drawable/img_miao3"
            android:duration="80" />
    </animation-list>
    

    开始及停止动画:

    var animDrawable = activity_frame_animation_iv.drawable as AnimationDrawable
    animDrawable.start()  //播放动画
    animDrawable.stop() //停止播放
    

    10. Animated-rotate

    配合着Rotate使用,达到自动播放效果

    <?xml version="1.0" encoding="utf-8"?>
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/test_rotate"
        android:pivotY="50%"
        android:pivotX="50%">
    
    </animated-rotate>
    

    11. Layer List (图层列表)

    使用layer-list 可以将多个 drawable 按照顺序层叠在一起显示。列表最后一个drawable 绘于顶部。

    11.1 我们可以通过 layer-list 和 selector 来实现下图效果

    该图通过使用一个红色背景层和一个白色背景层实现,白色背景层在通过设置 android:bottom 向上偏移,显示图底部红色背景层。 偏移属性其实和 Margin 一个作用。

    代码:

    <?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 android:drawable="@android:color/holo_red_dark" />
                <item android:bottom="4dp" android:drawable="@android:color/white" />
            </layer-list>
        </item>
    
    
        <item android:state_checked="false">
            <layer-list>
                <item android:drawable="@android:color/holo_red_dark" />
                <item android:bottom="2dp" android:drawable="@android:color/white" />
            </layer-list>
        </item>
    
    </selector>
    

    11.2 实现阴影效果

    偏移指的是移动整个图层

    <?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>
    
  • 相关阅读:
    matlab的特殊字符(上下标和希腊字母等)
    漫谈高数 特征向量物理意义
    小波变换
    泰勒级数
    关于均方差的一点知识
    论文笔记(4)-Deep Boltzmann Machines
    论文笔记(3)-Extracting and Composing Robust Features with Denoising Autoencoders
    论文笔记(2)-Dropout-Regularization of Neural Networks using DropConnect
    猪血豆腐
    离散时间系统结构
  • 原文地址:https://www.cnblogs.com/-Tiger/p/9364132.html
Copyright © 2011-2022 走看看