package lemon.view.com.lemonphotoview.view;
import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;
import lemon.view.com.lemonphotoview.R;
import lemon.view.com.lemonphotoview.view.utils.DpPxUtil;
public class TouXiangView extends View {
private PorterDuffXfermode xfermode;
private Bitmap bitmap;
private Paint paint;
private int padding = DpPxUtil.dip2px(getContext(), 50);
private int width = DpPxUtil.dip2px(getContext(), 300);
private int circleWidth = DpPxUtil.dip2px(getContext(), 5);
private RectF outerArea;
public TouXiangView(Context context) {
super(context);
}
public TouXiangView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private RectF drawArea;
{
paint = new Paint();
paint.setAntiAlias(true);
bitmap = getBitmap((int) (width * 1.5));
xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
outerArea = new RectF(padding, padding, padding + width, padding + width);
drawArea = new RectF(padding+ circleWidth, padding+ circleWidth, padding + width- circleWidth, padding + width- circleWidth);
}
/**
* 得到指定宽度的图片,高度会等比缩放
* 原图可能很大,不需要这么大的图片,为了节省内存 ,得到一张小的bitmap
*
* @param width
* @return
*/
private Bitmap getBitmap(int width) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.bitmap, options);
options.inJustDecodeBounds = false;
options.inDensity = options.outWidth;
options.inTargetDensity = width;
return BitmapFactory.decodeResource(getResources(), R.drawable.bitmap, options);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画一个红色圆作为底色,会有红边效果
paint.setColor(Color.RED);
canvas.drawOval(outerArea, paint);
//0. 离屏缓存,截取这个区域进行绘制,不然圆形的底部是整个View的区域,使用xfermode会有融合问题
canvas.saveLayer(drawArea, paint, Canvas.ALL_SAVE_FLAG);
//1. 先画一个圆形;
canvas.drawOval(drawArea, paint);// 小圆圈,
//2. 把笔设置为SRC_IN模式,意味这把底部的圆形当做绘制形状,把接下来绘制的bitmap当做绘制内容,进行合成图片
paint.setXfermode(xfermode);
//3.再画一个bitmap
canvas.drawBitmap(bitmap, padding, padding, paint);
//4. 还原paint和canvas
paint.setXfermode(null);
canvas.restore();
}
}