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