import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import com.example.admin.listviewdemo.R;
public class newCircle extends View {
private Bitmap mSourceBitmap;
PorterDuffXfermode xfermode;
private Paint paint;
public newCircle(Context context) {
this(context, null);
init();
}
public newCircle(Context context, AttributeSet attrs) {
this(context, attrs, 0);
init();
}
public newCircle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint=new Paint();
paint.setAntiAlias(true);//设置抗锯齿
paint.setStyle(Paint.Style.FILL);//设置填充样式
paint.setDither(true);//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
paint.setFilterBitmap(true);//加快显示速度,本设置项依赖于dither和xfermode的设置
xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);//绘制交集,显示上层
}
@Override
protected void onDraw(Canvas canvas) {
// 生成圆形Bitmap过程
mSourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yyy);//从资源文件中解析获取Bitmap
/**
* 设置View的离屏缓冲。在绘图的时候新建一个“层”,所有的操作都在该层而不会影响该层以外的图像
* 必须设置,否则设置的PorterDuffXfermode会无效
*/
int sc=canvas.saveLayer(0,0,getWidth()*2,getHeight()*2,paint,Canvas.ALL_SAVE_FLAG);
Matrix matrix = new Matrix();
float xscal = getWidth()/(1.0f*mSourceBitmap.getWidth());
float yscal = getHeight()/(1.0f*mSourceBitmap.getHeight());
float scal = xscal<yscal?yscal:xscal;
matrix.setScale(scal, scal);
canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth(),paint);
paint.setXfermode(xfermode);
canvas.translate(-(mSourceBitmap.getWidth()*scal - getWidth())/2,-(mSourceBitmap.getHeight()*scal - getHeight())/2);
canvas.drawBitmap(mSourceBitmap,matrix,paint);
paint.setXfermode(null);
/**
* 还原画布,与canvas.saveLayer配套使用
*/
canvas.restoreToCount(sc);
}
}
网友评论