自定义drawable
来源:互联网 发布:超市app送货上门软件 编辑:程序博客网 时间:2024/05/29 06:47
前面我们有自定义View实现了圆角图片和圆形图片,现在我通过自定Drawable同样可以实现相同的功能!
先来看看效果图!
好了,现在附上代码:
显示方形圆角图片,利用的BItmapShader方法实现,圆角图片我则利用Xfermode来实现
代码如下:
package com.wang.customdrawable.drawable;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.RectF;import android.graphics.Shader.TileMode;import android.graphics.drawable.Drawable;import android.util.Log;public class RoundImageDrawable extends Drawable{private Paint mPaint;private RectF mBound;private BitmapShader bitmapShader;private Bitmap mBitmap;public RoundImageDrawable(Bitmap bitmap) {mBitmap=bitmap;mPaint=new Paint();bitmapShader=new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);mPaint.setAntiAlias(true);mPaint.setShader(bitmapShader);}@Overridepublic void draw(Canvas canvas) {Log.i("wangsongbin", ""+mBound.width()+" "+mBound.height());
//并没有做等比例缩放,有兴趣的同学可以自己加上canvas.drawRoundRect(mBound, 30, 30, mPaint);} //此方法在onDraw方法执行前执行,获得用户给定的确定了的高宽@Overridepublic void setBounds(int left, int top, int right, int bottom) {super.setBounds(left, top, right, bottom);mBound=new RectF(left, top, right, bottom);}//如果包含它的控件没有给出明确的高宽,而是wrap_content,则会调用此方法获得图片的高宽@Overridepublic int getIntrinsicWidth() {return mBitmap.getWidth();}@Overridepublic int getIntrinsicHeight() {return mBitmap.getHeight();}@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}@Overridepublic void setColorFilter(ColorFilter cf) {mPaint.setColorFilter(cf);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}}圆形图片:
package com.wang.customdrawable.drawable;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorFilter;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.RectF;import android.graphics.drawable.Drawable;public class CircleImageDrawableXfermode extends Drawable {private Paint mPaint;private Bitmap mBitmap;private RectF mBound;private Canvas mCanvas;private Bitmap finalBitmap;public CircleImageDrawableXfermode(Bitmap bitmap) {mBitmap = bitmap;mPaint = new Paint();mPaint.setAntiAlias(true);}@Overridepublic void setBounds(int left, int top, int right, int bottom) {super.setBounds(left, top, right, bottom);mBound = new RectF(left, top, right, bottom);finalBitmap = Bitmap.createBitmap(right - left, bottom - top,Config.ARGB_8888);mCanvas = new Canvas(finalBitmap);}@Overridepublic void draw(Canvas canvas) {Matrix matrix = new Matrix();float scale = Math.max(mBound.width() * 1.0f / mBitmap.getWidth()* 1.0f, mBound.height() * 1.0f / mBitmap.getHeight() * 1.0f);matrix.setScale(scale, scale);mCanvas.drawBitmap(mBitmap, matrix, mPaint);mPaint.reset();mPaint.setColor(Color.BLUE);mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));mCanvas.drawBitmap(getBitmap(), 0, 0, mPaint);//后加入的是位图才管用!canvas.drawBitmap(finalBitmap, 0, 0, null);}public Bitmap getBitmap() { Bitmap bitmap = Bitmap.createBitmap((int)mBound.width(), (int)mBound.height(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); canvas.drawOval(new RectF(0, 0, mBound.width(), mBound.height()),paint); return bitmap; } @Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}@Overridepublic int getIntrinsicHeight() {return mBitmap.getHeight();}@Overridepublic int getIntrinsicWidth() {return mBitmap.getWidth();}@Overridepublic void setColorFilter(ColorFilter cf) {mPaint.setColorFilter(cf);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}}
具体利用就一行代码:
tv_three.setBackground(new CircleImageDrawableXfermode(bitmap));
大家可以和前面自定View方法比较一下,简单多了有没有?
源代码下载
0 0
- 自定义drawable
- 自定义drawable
- 自定义Drawable
- 自定义drawable
- 自定义Drawable
- 自定义drawable
- 自定义Drawable
- 自定义Drawable
- 自定义drawable
- 自定义drawable(shape)
- code自定义的Drawable
- 自定义drawable(shape)
- 自定义drawable(shape)
- 自定义drawable(shape)
- android 自定义View drawable
- Android自定义drawable
- android自定义drawable图形
- 自定义drawable android:shape
- LeetCode之Median of Two Sorted Arrays
- Java虚拟机JVM内存分区及代码执行机制
- 00-自测3. 数组元素循环右移问题 (20) java实现
- Activity中Flag的解释FLAG_ACTIVITY_SINGLE_TOP
- Android虚拟机(DVM)内存分配——内存溢出问题
- 自定义drawable
- HtmlParser整体框架
- Mac OS怎么查看系统隐藏文件
- 设计模式 笔记 中介者模式 Mediator
- 多接口使用同一套接词
- linux 系统调用
- Android:PendingIntent的FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT
- 百度副院长余凯在无锡CCF中的讲座心得
- apache开启.htaccess及.htaccess的使用方法