android 实现不一样的气泡型的图片

先看一张.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>

来张效果图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xiao_yuanjl/article/details/79658278