自定义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
原创粉丝点击