zoukankan      html  css  js  c++  java
  • android中常用的drawable

    一 drawable描述

    控件的绘制 可以在android项目的drawable目录下 配置 xml文件进行drawable定义

      以下是常用的drawable配置:

         shape 控件的圆角 背景 渐变 边框的设置 对应的类注释中存在对应标签的属性

                GradientDrawable绘制渐变

               ShapeDrawable 绘制渐变,边框 颜色,圆角等

         selector 控制不同状态下 控件的背景

              StateListDrawable 

          layerlist 图片的叠加

              LevelListDrawable

         animation-list 逐帧动画

             AnimationDrawable

          bitmap 创建可拉伸的矢量图

            BitmapDrawable

         clip 剪切图像

          ClipDrawable

    二 对应drawable详解

    1 shape配置 

       参考如下

    2 selector配置

       android:state_pressed=["true" | "false"]  //被点击   
       android:state_focused=["true" | "false"]  //获得焦点   
       android:state_selected=["true" | "false"] //被选中   
       android:state_checkable=["true" | "false"] //可以被check时   
       android:state_checked=["true" | "false"]  //被check时,例如用于checkbox   
       android:state_enabled=["true" | "false"]  //可用时,即能接收click/touch事件   
       android:state_window_focused=["true" | "false"]  //所在的窗口获得焦点

      设置以上配置 可以当控件处于某种状态时显示某些背景 

      比如 在drawable下定义selector.xml内容如下:

       <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 触摸屏或者鼠标按下时触发  松开后 开事件消失 -->
        <item android:drawable="@drawable/button2" android:state_pressed="true"></item>
        <!-- 获取焦点的事件  一般都用于文本框 -->
        <item android:drawable="@drawable/button1" android:state_focused="true"></item>
        <item android:state_focused="true" android:drawable="@drawable/button3"></item>

        <!--这里表示默认的背景图片 一定要写在最下面 不然其他的状态都无效 -->
        <item android:drawable="@drawable/button3"></item>
    </selector>

    在文本框控件中:

       <EditText android:id="@+id/myText" android:layout_marginTop="10dp"  android:background="@drawable/selector" android:layout_width="100dp"
             android:layout_height="50dp"   android:layout_below="@id/btn1"/>

    3 layerlist配置

       可以将两张图片叠加作为背景显示

       可以设置某些项的左右下上的距离

       <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
        <item>
            <bitmap  android:src="@drawable/q1" android:antialias="true"/>
        </item>

       <!--第二张图片离左边的距离为100dp   bitmap默认会自动拉伸到控件的大小-->
        <item android:left="100dp">
             <bitmap  android:src="@drawable/ic_launcher" />
        </item>
    </layer-list>

    效果如下:


    4 animation-list配置

       drawable目录下定义myaimation.xml  内容如下:

        <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
            <item android:drawable="@drawable/q1" android:duration="150"/>
            <item android:drawable="@drawable/q2" android:duration="150"/>
            <item android:drawable="@drawable/q3" android:duration="150"/>
            <item android:drawable="@drawable/q4" android:duration="150"/>
         </animation-list>

         这里 android:oneshot="false" true表示是否只循环一次  如果为false表示 一直循环播放

    定义了4个item 当调用播放时 先显示@drawable/q1图片  150ms后 执行@drawable/q2

    当q4执行完后150秒 循环又开始播放q1

       布局中定义:

         <ImageView android:id="@+id/abc" android:layout_width="fill_parent" android:layout_height="90dp" 
            android:src="@drawable/myaimation"
            />
        <Button  android:id="@+id/btn"  android:layout_width="100dp" android:layout_height="50dp" android:text="播放" android:layout_below="@id/abc"/>
       ImageView 用于播放指定的animation-list  点击按钮后触发事件:

          ImageView iView=(ImageView)MainActivity.this.findViewById(R.id.abc);
         AnimationDrawable ad =(AnimationDrawable)iView.getDrawable();
         ad.start();

    4 bitmap配置

       进行图片的一些简单操作 比如拉伸 滤波 去锯齿等

    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/ic_launcher"  --必须指定图片不能是xml文件
        android:antialias="true"  --锯齿
        android:filter="true"      --滤波
        android:gravity="right"    --右边对齐
         >

    如果ImageView设置为长度100dp  bitmap本身设置的图片是50dp 那么图片会自动拉伸扩展到100dp 会出现模糊

    可以使用android:gravity 表示图片不拉伸 自动填充到指定位置对齐 比如right  图片将位于控件右边 控件左边50dp就是空白

    5 color配置

    color标签是drawable里最简单的标签了,只有一个属性:android:color,指定颜色值。这个标签一般很少用,因为基本都可以通过其他更方便的方式定义颜色。另外,颜色值一般都在colors.xml文件中定义,其根节点为resources。看看两者的不同:


    <!-- 文件:res/drawable/white.xml -->
    <color xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="#FFFFFF" />
    <!-- 文件:res/values/colors.xml -->
    <resources>
        <color name="white">#FFFFFF</color>
    </resources>
    引用的时候,前一种通过@drawable/white引用,后一种通过@color/white引用。

    6 inset配置

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android" 
        android:visible="true"
        android:insetLeft="10dp"
        >
    <shape>
        <padding android:left="50dp"/>
        <solid android:color="@android:color/holo_orange_light" />
    </shape>
    </inset>

    inset 设置背景和控件的外边距 如果设置了 外边距就不会绘制背景图片  可以设置左右上下的距离

    shape中的padding表示绘制内边距 这时内边距的部分也绘制了背景图片  这时光标就在内边距 +外边距之后

    如果是 按钮 按钮的文本就鱼尾 外边距+内边距后面

    图解:

    文本框


    按钮:


    6 clip配置

    使用剪切图像资源可以只显示一部分图像,这种资源经常被用在进度条的制作上。剪切图像资源是一个XML格式文件,资源只包含一个<clip>标签

    举例:drawable下添加 myclip.xml

    <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"  
        android:gravity="left"   从左边开始剪切

        android:clipOrientation="horizontal"  水平剪切
        android:drawable="@drawable/button5"    被剪切的背景图
         >
    </clip>

    ClipDrawable类内部预设了一个最大的level值10000 表示截取该图片的全部  如果设置为0 截取该图片的宽度为0  相当于背景图没有设置 这个参数只能在代码中设置

    这里在布局文件中 添加一个父容器 设置背景图  在Button上设置剪切

    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" 
            android:background="@drawable/button2" android:layout_marginTop="10dp">
        <Button  android:id="@+id/btn22"  android:layout_width="fill_parent"   android:layout_height="50dp" 
            android:layout_below="@id/myText1" android:background="@drawable/myclipe" />
        </LinearLayout>

    如果 代码设置

    ClipDrawable cd=(ClipDrawable)(((Button)findViewById(R.id.btn22)).getBackground());
    cd.setLevel(10000);//设置为最大值1000 LinearLayout 的背景图被完全覆盖了


    如果设置为 

    cd.setLevel(5000);

    截取 一半的图像显示 左边一半就是clip指定的图像的一半 右边显示LinearLayout一半的图像

    7 scale配置

    使用scale标签可以对drawable进行缩放操作,和clip一样是通过设置level来控制缩放的比例

    android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
    android:scaleHeight 设置可缩放的最大高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半 缩放设置的level超过了这个百分比无法缩放
    android:scaleWidth 设置可缩放的最大宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
    android:scaleGravity 设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left
    android:useIntrinsicSizeAsMinimum 设置drawable原有尺寸作为最小尺寸,设为true时,缩放基本无效,API Level最低要求为11

    举例

    drawable添加myscale.xml文件

    <scale
        android:drawable="@drawable/button5"
        android:scaleWidth="0%"   --表示水平不能缩放 就算设置了level也无效
        android:scaleHeight="80%"  --表示高度 设置level不能缩放超过80%
        xmlns:android="http://schemas.android.com/apk/res/android">
    </scale>

    布局文件

    <EditText android:id="@+id/myText1"android:background="@drawable/myscale" android:layout_width="fill_parent"
             android:layout_height="50dp"   android:layout_below="@id/myText"/>

    在java代码中设置level  level的范围是  【0-10000】

    findViewById(R.id.myText1).getBackground().setLevel(8000);

    这里 水平 比例  8000/10000 缩放了80% 超过了最大 0%无法缩放 就是拉伸填充原始宽度

            高度  8000/10000 缩放了80%  等于最大值 80% 自动缩放高度到原始高度的80%

       宽度没有缩放  高度黑色的部分缩放了


    7 rotate配置

    使用rotate标签可以对一个drawable进行旋转操作,在shape篇讲环形时最后举了个进度条时就用到了rotate标签。另外,比如你有一张箭头向上的图片,但你还需要一个箭头向下的图片,这时就可以使用rotate将向上的箭头旋转变成一张箭头向下的drawable。
    先看看rotate标签的一些属性吧:


    android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
    android:fromDegrees 起始的角度度数
    android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针
    android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5; 百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心
    android:pivotY 旋转中心的Y坐标
    android:visible 设置初始的可见性状态,默认为false
    示例代码如下,目标是将一张箭头向上的图片转180度,转成一张箭头向下的图片:


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

    如果使用以上设置没有任何效果不会旋转  如果单纯只是旋转 只需要设置fromDegrees这个参数的角度 就可以旋转指定的角度

    android:pivotX 表示旋转角度的x坐标  50%为控件宽度的50%

    如果需要android:toDegrees  有效果 必须代码 设置level属性 [0-10000]

    如果设置为 5000   旋转的长度 等于  5000/1000  *(180-0)







  • 相关阅读:
    postgreSQL官网对json的一些说明
    postgreSQL_jsonb中某一个键值对的修改操作
    redis基础
    failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
    012、时间、日期控件
    011、AutoCompleteTextView控件,具有自动提示功能的菜单
    010、Spinner使用
    009、使用ViewFlipper实现左右滑动事件
    008、不同程序的彼此调用
    007、判断手机操作系统是否允许运行程序
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331233.html
Copyright © 2011-2022 走看看