文档章节

Android之Drawable

尧Yannick
 尧Yannick
发布于 2016/04/22 14:40
字数 1140
阅读 6
收藏 0

Drawable

BitmapDrawable

<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ic_launcher"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:tileMode="mirror"
    >
</bitmap>


Antialias属性表示是否开启抗锯齿功能一般为true,dither属性表示是否开启抖动,一般为true,filter属性表示是否开启过滤效果,tileMode属性表示平铺模式

ShapeDrawable

定义
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"
    >
    <solid android:color="#00bcd4"/>
    <corners android:radius=""/>
    <padding android:left=""/>
    <size android:width=""/>
<stroke />
<gradient />
</shape>


Shape属性有rectangle(矩形),oval(椭圆),line(横线),ring(圆环)
使用line或ring属性定义shapeDrawable时必须指定stroke标签线的宽度颜色。
Solid属性表示纯色填充。
Gradient属性表示渐变色填充,其具体属性有:
Angle渐变角度默认为0,必须为45的倍数,0表示从左到右,90表示从上到下。
centerX渐变中心的横坐标
centerY渐变中心的纵坐标
startColor渐变的起始颜色
centerColor渐变的中间颜色
endColor渐变的结束颜色
gradientRadius渐变半径 仅当type=radial时有效
type渐变类别其值有 linear(线性渐变),radial(径向渐变),sweep(扫描渐变)。
Stroke属性表示描边
<stroke 
   android:width="2dp"
   android:dashWidth="2dp" // 表示虚线的宽度
   android:dashGap="4dp"  //表示虚线之间的间隔
   android:color="#00bcd4"/>


size属性表示shapeDrawable的固有大小(非最终显示大小),一般shapedrawable通过getIntrinsicHeight跟getIntrinsicWidth时会返回-1,当设置size属性时会返回其设置的值。

LayerDrawable

Layerdrawable 对应xml标签的layer-list,表示层次化的drawable集合。
通过将不同的Drawable放置在不同层上面从而达到一种叠加后的效果。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:drawable="@drawable/ic_launcher"
        android:id=""
        android:top=""
        android:right=""
        android:bottom=""
        android:left=""
        >
    </item>
</layer-list>


其中 top,right,bottom,left分别表示相对于view上下左右的偏移量。
例子:仿照微信输入框效果
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
//第一个item将背景填充成蓝色
    <item >
        <shape android:shape="rectangle">
            <solid android:color="#00bcd4"/>
        </shape>
    </item>
    //第二个item将距离底部6dp的位置填充为白色,底部6dp内为蓝色
    <item android:bottom="6dp">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
        </shape>
</item>
//第三个item将距离底部1dp,左右1dp的位置填充为白色,所以只留下左右高6dp宽1dp的蓝色线,底部1dp的蓝色线
    <item android:bottom="1dp"
        android:left="1dp"
        android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</layer-list>


StateListDrawable

对应selector标签,页表示drawable的集合。每个drawable对应view的一种状态。
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:constantSize=""
    android:dither=""
    android:variablePadding=""
    >
    <item 
        android:state_focused="" //表示view获得了焦点
        android:state_pressed=""//表示button按下后没有松开状态
        android:state_active=""
        android:state_checked=""
        android:state_window_focused=""
<span style="white-space:pre">	</span>android:drawable=""
        .
        .
        >
        <shape >
            .
            .
            .
        </shape>
    </item>
</selector>


constantSize表示StateListDrawable的固有大小是否随着状态改变而保持不变。
variablePadding表示StateListDrawable的padding是否会随着其状态改变而改变。

LevelListDrawable

等级范围由0~10000,0是默认等级,imageview可通过setImageLevel来切换drawable。
<level-list>
<item
android:drawable=””
android:maxLevel=””
android:minLevel=””
/>
<item
android:drawable=””
android:maxLevel=””
android:minLevel=””
/>
</level-list>


InsetDrawable

InsetDrawable对应于inset标签。可以将drawable内嵌到自己当中,并且留一定距离。
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="5dp"
    android:insetRight="5dp"
    android:insetTop="5dp"
    android:insetBottom="5dp"
    android:drawable=""
    >
    <item>
        <shape >
            
        </shape>
    </item>
</inset>


ScaleDrawable

Scaledrawable对应于scale标签,可根据自己的等级将drawable缩放到一定比例。
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/ic_launcher"
    android:scaleGravity="center"
    android:scaleHeight="50%"
    android:scaleWidth="50%"
    >
</scale>


等级对scaledrawable的影响很大,默认等级为0,当等级为0时scaledrawable不可见(从android源码处可见)
Public void draw(Canvas canvas)
{
     if(mScaleState.mDrawable.getLevel()!=0)
         mScaleState.mDrawable.draw(canvas);
}


所以在使用之前,必须设置scaledrawable的level大于0(等级范围0-10000)
ScaleDrawable scaledrawable=view.getBackground();
scaledrawable.setlevel(1);


ClipDrawable

Clipdrawable对应clip标签,可以根据自己的等级(范围0-10000,0表示不裁剪,5000表示裁剪50%)来裁剪drawable.裁剪方向由clipOriention跟gravity共同决定。其中gravity属性值之间可以通过’|’连接。
用法:
1.
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/circle"
    android:gravity="bottom"
      >
</clip>


2.
<ImageView
        android:id="@+id/clip_img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/clip" />


3.
Clip_img=(ImageView)findViewById(R.id.clip_img);
ClipDrawable clipDrawable=(ClipDrawable) clip_img.getDrawable();
clipDrawable.setLevel(5000);


自定义Drawable

自定义drawable是通过重写drawable的draw方法实现。
缺点:自定义的drawable无法在xml中使用。
public class CustomDrawable extends Drawable {

Paint mPaint;

public CustomDrawable()
{
    mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(Color.RED);
}

@Override
public void draw(Canvas canvas) {
    Rect rect = getBounds();
    float cx=rect.exactCenterX();
    float cy=rect.exactCenterY();
    canvas.drawCircle(cx, cy, Math.min(cx, cy), mPaint);
}


@Override
public void setAlpha(int alpha) {
    mPaint.setAlpha(alpha);
    invalidateSelf();
}


@Override
public void setColorFilter(ColorFilter colorFilter) {
    mPaint.setColorFilter(colorFilter);
    invalidateSelf();
}


@Override
public int getOpacity() {
    return PixelFormat.TRANSLUCENT;
}


}


© 著作权归作者所有

共有 人打赏支持
尧Yannick
粉丝 0
博文 16
码字总数 6692
作品 0
武汉
私信 提问
Android 自定义progressDialog

导入CustomProgressDialog.java 2. styles.xml: <style name="CustomProgressDialog" parent="@android :style/Theme.Dialog"> <item name="android:windowBackground">@android :color/tr......

40岁的青春
2015/04/25
0
0
android 自定义checkbox与文字的距离设置

改变checkbox默认的文字与选框之间的距离两种方案,刚刚开始接触checkbox 的时候由于不熟悉控件,使用了组合控件:一个未设定text的CheckBox和一个TextView来达到目的。后来发现只需要设定C...

NotFoundException
2014/05/13
0
0
三种方式实现自定义圆形进度条ProgressBar

一、通过动画实现 定义res/anim/loading.xml如下: [html]view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://......

等待流星
2013/10/17
0
0
代码实现selector的StateListDrawable(选择器),定义xml中的selector,AnimatedStateListDrawable

> AnimatedStateListDrawable,Android 5.0 AnimatedStateListDrawable是在API21提出,针对于Android 5.0。Drawable包含一组可绘制的关键帧,其中当前显示的关键帧是基于当前状态集来选择的。...

desaco
01/13
0
0
android的selector(背景选择器)

最近做listview和button都要改变Android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。 首先android的selector是在drawable/xxx.xml中配置的。 ...

z.net
2012/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但...

echojson
24分钟前
5
0
tomcat 集群与 redis 分布式

1.学习

狼王黄师傅
26分钟前
1
0
如何正确的每天坚持背5个单词?

自从开始学习英语,我们的老师就一直告诉我们,如果每天能坚持背五个单词,一年365天就能背1800个单词初中三年,你就能背会5400个单词,背会5400个单词,就算参加高考也搓搓有余。 好吧,话是...

我是菜鸟我骄傲
36分钟前
1
0
Docker之MySql5.7中only_full_group_by的问题解决

MySql的镜像,默认情况下,MySql5.7中的sql_mode含有only_full_group_by,group by语句有时候会报错。通过手动修改sql_mode,那么如果删除容器或者新建容器,就会导致我们手动设置的sql_mod...

克虏伯
53分钟前
0
0
介绍Python中6个序列的内置类型

1、Python中6个序列的内置类型分别是什么? Python包含6中内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象。序列通用的操作包括:索引、长度、组合(序列相加)...

问题终结者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部