前面我们有自定义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);
}
@Override
public void draw(Canvas canvas) {
Log.i("wangsongbin", ""+mBound.width()+" "+mBound.height());
//并没有做等比例缩放,有兴趣的同学可以自己加上
canvas.drawRoundRect(mBound, 30, 30, mPaint);
}
//此方法在onDraw方法执行前执行,获得用户给定的确定了的高宽
@Override
public 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,则会调用此方法获得图片的高宽
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@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;
}
}
圆形图片:
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);
}
@Override
public 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);
}
@Override
public 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;
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
具体利用就一行代码:
tv_three.setBackground(new CircleImageDrawableXfermode(bitmap));
大家可以和前面自定View方法比较一下,简单多了有没有?