2个createBitmap之PorterDuffXfermode

本文介绍了一种自定义Android ImageView的方法,使其能够显示圆形图像,并在圆内嵌套logo。通过使用Bitmap和Canvas绘制技术,实现了对图像的裁剪及合成。
package com.safly.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Xfermode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by Administrator on 2017/4/24.
 */

public class CustomeImageView extends View {

    private Context mContext;

    Bitmap logoBitmap;
    private int logoWidth;
    private int logoHeight;
    private int circleRadius;

    private Paint mReactPaint;
    private int offSize;

    int measureWeight;
    int measureHeight;

    public CustomeImageView(Context context) {
        super(context);
    }

    public CustomeImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        this.mContext = context;
        initRes();
    }

    public CustomeImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    private void measureLogo() {
        logoBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.logo);
        logoHeight = logoBitmap.getHeight();
        logoWidth = logoBitmap.getWidth();
        int i = logoHeight * logoHeight + logoWidth * logoWidth;
        circleRadius = (int) Math.sqrt(i)/2;

        offSize = circleRadius - logoWidth/2;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int Wmode = MeasureSpec.getMode(widthMeasureSpec);
        int Wsize = MeasureSpec.getSize(widthMeasureSpec);

        int Hmode = MeasureSpec.getMode(heightMeasureSpec);
        int Hsize = MeasureSpec.getSize(widthMeasureSpec);

        measureWeight = 0;
        measureHeight = 0;
        //宽度
        if (Wmode == MeasureSpec.AT_MOST) {

            measureWeight = circleRadius*2;
        }else if(Wmode == MeasureSpec.EXACTLY){
            measureWeight = Wsize;
        }

        //高度
        if (Hmode == MeasureSpec.AT_MOST) {
            measureHeight =  circleRadius*2;
        }else if(Hmode == MeasureSpec.EXACTLY){
            measureHeight = Hsize;
        }

        setMeasuredDimension(measureWeight,measureHeight);
    }
    private void initRes() {
        //获取图片的尺寸
        measureLogo();
        //粉色
        if (mReactPaint == null){
            mReactPaint = new Paint();
            mReactPaint.setColor(Color.parseColor("#FF6A6A"));
            mReactPaint.setAntiAlias(true);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//        canvas.drawColor(Color.parseColor("#ffffff"));

        Bitmap destBitmap = Bitmap.createBitmap(logoWidth,logoHeight, Bitmap.Config.ARGB_8888);
        Canvas destCanvas = new Canvas(destBitmap);
        RectF rect = new RectF(0,0,logoWidth,logoHeight);
        destCanvas.drawRect(rect,mReactPaint);

        canvas.drawBitmap(destBitmap,offSize,offSize,null);

        Bitmap srcBitmap = Bitmap.createBitmap(measureWeight,measureHeight, Bitmap.Config.ARGB_8888);
        Canvas srcCanvas = new Canvas(srcBitmap);
        srcCanvas.drawCircle(measureWeight/2,measureHeight/2,circleRadius,mReactPaint);
        mReactPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(srcBitmap,0,0,mReactPaint);
    }
}

注意setXfermode顺序,在drawCircle之后!!!!!!!!!!
效果如下
这里写图片描述

改成
mReactPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
这里写图片描述

创建一个单边圆角的Bitmap可以通过以下步骤实现: 1. **创建一个原始Bitmap的副本**:首先,我们需要创建一个原始Bitmap的副本,以便在不修改原始Bitmap的情况下进行操作。 2. **创建一个新的Bitmap**:创建一个新的Bitmap来存储圆角后的图像。 3. **绘制圆角**:使用Canvas和Paint对象在新的Bitmap上绘制圆角。 以下是一个示例代码,展示了如何创建一个单边圆角的Bitmap: ```java import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; public class RoundedCornerBitmap { public static Bitmap createSingleRoundedCornerBitmap(Bitmap bitmap, float cornerRadius, int cornerPosition) { Bitmap outputBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(outputBitmap); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(0xff424242); // 设置画笔颜色 Path path = new Path(); Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); switch (cornerPosition) { case 1: // 左上角 path.moveTo(0, cornerRadius); path.lineTo(0, 0); path.lineTo(cornerRadius, 0); path.quadTo(0, 0, 0, cornerRadius); path.lineTo(0, bitmap.getHeight()); path.lineTo(bitmap.getWidth(), bitmap.getHeight()); path.lineTo(bitmap.getWidth(), 0); break; case 2: // 右上角 path.moveTo(0, 0); path.lineTo(bitmap.getWidth() - cornerRadius, 0); path.quadTo(bitmap.getWidth(), 0, bitmap.getWidth(), cornerRadius); path.lineTo(bitmap.getWidth(), bitmap.getHeight()); path.lineTo(0, bitmap.getHeight()); break; case 3: // 左下角 path.moveTo(0, 0); path.lineTo(bitmap.getWidth(), 0); path.lineTo(bitmap.getWidth(), bitmap.getHeight()); path.lineTo(cornerRadius, bitmap.getHeight()); path.quadTo(0, bitmap.getHeight(), 0, bitmap.getHeight() - cornerRadius); path.lineTo(0, 0); break; case 4: // 右下角 path.moveTo(0, 0); path.lineTo(bitmap.getWidth(), 0); path.lineTo(bitmap.getWidth(), bitmap.getHeight() - cornerRadius); path.quadTo(bitmap.getWidth(), bitmap.getHeight(), bitmap.getWidth() - cornerRadius, bitmap.getHeight()); path.lineTo(0, bitmap.getHeight()); path.lineTo(0, 0); break; default: path.moveTo(0, 0); break; } path.close(); canvas.drawPath(path, paint); paint.setXfermode(new android.graphics.PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return outputBitmap; } } ``` 在这个示例中,`createSingleRoundedCornerBitmap`方法接受一个原始Bitmap、一个圆角半径和一个角位置参数。角位置参数用于指定哪个角需要圆角化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值