Android实践之Drawable的使用
2016-03-28 17:48
537 查看
在上篇博客一起来说说那些你不知道的Drawable中,我们介绍了各类的Drawable对象,对各个属性也进行了介绍。当然还有一些疑惑点还没解释,我们暂且搁置一边,先来根据各个属性做个练习。Let’s go!!
算作一个小系列吧!
一起来说说那些你不知道的Drawable
在这里给大家推荐一个在线查看shape效果的网站:
http://angrytools.com/android/button/
边框线:边框线的绘制我们需要使用stroke标签
圆角:使用corners标签
即我们的shape文件的配置如下:
是不是很简单,在也不用可怜巴巴的找美工的切图了。
这样是不是很low,而且还在布局文件中防止了大量的控件,降低了布局的解析速度,降低了效率。熟练使用各类drawable,即可帮助我们解决这个问题。
分析:既然实现下划线背景,说明我们还是要描边,即需要stroke标签,但是仔细想想,系统给我们提供的描边,是对四个边都进行描边,那我们怎么实现只有下划线的描边呢?这里我们可以换种思路,即利用layer-list,通过图层的叠盖,达到效果。
在第一个图层item中,我们实现了边框。在第二个图层item中,我们通过设置paddingBottom属性达到覆盖效果。
相应的,我们通过修改left,right,top可以实现上下左右边框线的效果。
效果图:
根据一起来说说那些你不知道的Drawable文章,我们知道系统给我们重写Drawable而得来的几个子类,它们也是通过继承Drawable而来,所以我们同样也可以。查看Drawable源码,我们需要明白以下几个方法:
public abstract void draw(Canvas canvas);用来在drawable的bounds内进行绘制。
public void setBounds(int left, int top, int right, int bottom),用来设定drawable的范围
public void setDither(boolean dither),是否放置抖动
public void setFilterBitmap(boolean filter),当绘制bitmap时使用,如果不涉及可以忽略,典型针对BitmapDrawable
public abstract void setAlpha(int alpha),设置透明度,范围0——255
public abstract void setColorFilter(ColorFilter cf);设置颜色过滤器
public abstract int getOpacity(),返回这个drawable是否透明,PixelFormat.UNKNOWN、PixelFormat.TRANSLUCENT(半透明)、PixelFormat.TRANSPARENT(透明)、PixelFormat.OPAQUE(不透明)
public int getIntrinsicWidth():drawable的宽度
public int getIntrinsicHeight():drawable的高度
这里,我们自定义,所以就没有办法在xml中进行使用,就得用代码了,通过设置drawable:
大家可以注意到,ImageView的展示还是蛮正常的,但是Button的背景就不正常了,这是为什么呢?大家查看源码思考下。
暂时想到这么多,其实只要基础的原理会了,自然写起来就方便。后面想起来在补吧!如果大家有比较好的案例,欢迎推荐。
算作一个小系列吧!
一起来说说那些你不知道的Drawable
在这里给大家推荐一个在线查看shape效果的网站:
http://angrytools.com/android/button/
案例一、带边框的圆角背景图
分析:边框线:边框线的绘制我们需要使用stroke标签
圆角:使用corners标签
即我们的shape文件的配置如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp" /> <corners android:radius="8dp"/> <stroke android:width="1dp" android:color="#646464"/> </shape>
是不是很简单,在也不用可怜巴巴的找美工的切图了。
案例二、实现下划线背景
在实际开发中,我们经常可以看到布局中间充斥着一些线条,有些同学使用一个view进行模拟。<View android:layout_height="0.5dp" android:layout_width="match_parent" android:backgroud="#808080"/>
这样是不是很low,而且还在布局文件中防止了大量的控件,降低了布局的解析速度,降低了效率。熟练使用各类drawable,即可帮助我们解决这个问题。
分析:既然实现下划线背景,说明我们还是要描边,即需要stroke标签,但是仔细想想,系统给我们提供的描边,是对四个边都进行描边,那我们怎么实现只有下划线的描边呢?这里我们可以换种思路,即利用layer-list,通过图层的叠盖,达到效果。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <stroke android:color="#606060" android:width="1dp"/> </shape> </item> <item android:bottom="1dp"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF"/> </shape> </item> </layer-list>
在第一个图层item中,我们实现了边框。在第二个图层item中,我们通过设置paddingBottom属性达到覆盖效果。
相应的,我们通过修改left,right,top可以实现上下左右边框线的效果。
案例三、实现灰色背景效果
<selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true"> <shape android:shape="rectangle"> <stroke android:width="0.5dp" android:color="#909090"/> <solid android:color="#606060"/> <corners android:radius="2dp"/> </shape> </item> <item android:state_pressed="false"> <shape android:shape="rectangle"> <stroke android:width="0.5dp" android:color="#909090"/> <solid android:color="#FFFFFF"/> <corners android:radius="2dp"/> </shape> </item> </selector>
效果图:
案例四、实现圆形图片
在许久以前,刚写博客的时候,写了一个自定义圆形控件,Android自定义控件之圆形头像在这篇文章中采用了重写ImageView方法进行。这次我们采用自定义Drawable来达到我们的效果。根据一起来说说那些你不知道的Drawable文章,我们知道系统给我们重写Drawable而得来的几个子类,它们也是通过继承Drawable而来,所以我们同样也可以。查看Drawable源码,我们需要明白以下几个方法:
public abstract void draw(Canvas canvas);用来在drawable的bounds内进行绘制。
public void setBounds(int left, int top, int right, int bottom),用来设定drawable的范围
public void setDither(boolean dither),是否放置抖动
public void setFilterBitmap(boolean filter),当绘制bitmap时使用,如果不涉及可以忽略,典型针对BitmapDrawable
public abstract void setAlpha(int alpha),设置透明度,范围0——255
public abstract void setColorFilter(ColorFilter cf);设置颜色过滤器
public abstract int getOpacity(),返回这个drawable是否透明,PixelFormat.UNKNOWN、PixelFormat.TRANSLUCENT(半透明)、PixelFormat.TRANSPARENT(透明)、PixelFormat.OPAQUE(不透明)
public int getIntrinsicWidth():drawable的宽度
public int getIntrinsicHeight():drawable的高度
public class CircleDrawable extends Drawable { private Paint mPaint; private int cx,cy,radius; private int mWidth; private Bitmap mBitmap ; public CircleDrawable(Bitmap bitmap){ mBitmap = bitmap ; mPaint = new Paint(); mPaint.setShader(new BitmapShader(bitmap,TileMode.CLAMP,TileMode.CLAMP)); mPaint.setAntiAlias(true); mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight()); } @Override public void setBounds(int left, int top, int right, int bottom) { super.setBounds(left, top, right, bottom); cx = (left + right)/2; cy =(top + bottom)/2; radius = Math.abs(right - left) /2 - Math.abs(bottom - top) /2 > 0 ? Math.abs(bottom - top) /2:Math.abs(right - left) /2; } @Override public void draw(Canvas canvas) { canvas.drawCircle(cx, cy, radius, mPaint); } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicWidth() { return mWidth; } @Override public int getIntrinsicHeight() { return mWidth; } }
这里,我们自定义,所以就没有办法在xml中进行使用,就得用代码了,通过设置drawable:
btn_btn.setBackgroundDrawable(new CircleDrawable(bitmap)); iv.setImageDrawable(circleDrawable);
大家可以注意到,ImageView的展示还是蛮正常的,但是Button的背景就不正常了,这是为什么呢?大家查看源码思考下。
暂时想到这么多,其实只要基础的原理会了,自然写起来就方便。后面想起来在补吧!如果大家有比较好的案例,欢迎推荐。
相关文章推荐
- Android判断软键盘显示状态并隐藏
- Android Serialization序列化
- android java和js交互
- Android5.0动画,360安全卫士按下波纹效果
- Gradle Android插件用户指南翻译
- Android生成二维码和扫描二维码zxing
- Android--Activity生命周期
- android 获取屏幕高度和宽度的方法
- 在Android中生成HMAC-SHA1 签名
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android Studio : Gradle
- Android官方开发文档Training系列课程中文版:数据存储之文件存储
- Android 父控件wrap_content随笔
- Android View绘制13问13答
- Android最佳性能实践(四)——布局优化技巧
- 谈谈Android 6.0运行时权限理解
- Android中Activity和Service简单交互(通过广播机制)
- 浅析android应用增量升级
- android开发--drawerlayout(v4)
- Android中动态设置布局高度一致