自定义imageview,实现仿微信的气泡型的图片

package com.padandroid.wechat.widget;

import java.lang.ref.WeakReference;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Xfermode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

import com.padandroid.wechat.R;

public class ChatImageView extends MyImageView {
	private Context mContext;
	private static final Xfermode sXfermode = new PorterDuffXfermode(
			PorterDuff.Mode.DST_IN);
	private Bitmap mMaskBitmap;
	private Paint mPaint;

	private WeakReference<Bitmap> mSrcWeakBitmap;

	private int mLastWidth;
	private int mLastHeight;
	private int maskRes;

	public ChatImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		mPaint = new Paint();
		TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ChatImageView);
		maskRes = a.getResourceId(R.styleable.ChatImageView_mask_res, -1);
		a.recycle();
	}

	public void invalidate() {
		mSrcWeakBitmap = null;
		if (mMaskBitmap != null) {
			mMaskBitmap.recycle();
		}
		mLastWidth = 0;
		mLastHeight = 0;
		super.invalidate();
	}

	@SuppressLint("DrawAllocation")
	@Override
	protected void onDraw(Canvas canvas) {
		if (!isInEditMode()) {
			int width = getWidth();
			int height = getHeight();

			int i = canvas.saveLayer(0.0F, 0.0F, width, height, null,
					Canvas.ALL_SAVE_FLAG);
			try {
				Bitmap srcBitmap = mSrcWeakBitmap != null ? mSrcWeakBitmap
						.get() : null;
				if (srcBitmap == null || srcBitmap.isRecycled()) {
					Drawable srcDrawable = getDrawable();
					if (srcDrawable != null) {
						srcBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);
						Canvas srcBitmapCanvas = new Canvas(srcBitmap);
						srcDrawable.setBounds(0, 0, getWidth(), getHeight());
						srcDrawable.draw(srcBitmapCanvas);
						if (mMaskBitmap == null || mMaskBitmap.isRecycled()
								|| mLastWidth != width || mLastHeight != height) {
							mMaskBitmap = getMask(width, height);
						}
						drawBitmap(srcBitmapCanvas, mMaskBitmap, mPaint);
						mSrcWeakBitmap = new WeakReference<Bitmap>(srcBitmap);
					}
				}

				if (srcBitmap != null) {
					mPaint.setXfermode(null);
					canvas.drawBitmap(srcBitmap, 0.0F, 0.0F, mPaint);
				}
			} catch (Exception e) {
				System.gc();
			} finally {
				canvas.restoreToCount(i);
			}
		} else {
			super.onDraw(canvas);
		}
	}

	public void drawBitmap(Canvas canvas, Bitmap bitmap, Paint paint) {
		paint.reset();
		paint.setFilterBitmap(false);
		paint.setXfermode(sXfermode);

		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
	
	private Bitmap getMask(int width, int height) {
		Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(Color.BLACK);
		Drawable mask = mContext.getResources().getDrawable(
				maskRes);
		mask.setBounds(0, 0, width, height);
		mask.draw(canvas);
		return bitmap;
	}


}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值