先看一张.9气泡图片
直接上代码:
package com.personal.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
package com.personal.myapplication.widget;
import android.annotation.SuppressLint;
import android.content.Context;
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 android.widget.ImageView;
import com.personal.myapplication.R;
import java.lang.ref.WeakReference;
public class ChatBubbleImageView extends ImageView {
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;
public ChatBubbleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mPaint = new Paint();
}
@Override
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()) {
drawBitmap(canvas);
} else {
super.onDraw(canvas);
}
}
public void drawBitmap(Canvas canvas) {
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);
}
}
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(
R.mipmap.chatfrom_bg_pressed);
mask.setBounds(0, 0, width, height);
mask.draw(canvas);
return bitmap;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary">
<com.personal.myapplication.widget.ChatBubbleImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ooo_ppp"
android:layout_marginTop="19dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:id="@+id/chat_bubble_image_view_2"
android:layout_alignParentTop="true"
android:visibility="visible"
android:layout_centerHorizontal="true">
</com.personal.myapplication.widget.ChatBubbleImageView>
</RelativeLayout>
来张效果图: