2个createBitmap之PorterDuffXfermode

xiaoxiao2021-02-28  138

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));

转载请注明原文地址: https://www.6miu.com/read-37972.html

最新回复(0)