需求切圆角+图像可自由缩放,最终还要将整个view生成带透明通道的图片
https://gitee.com/olleh/RoundPhotoView.git
Paint有一个专门用于处理图片外形特效的API:Xfermode
在Android的SDK中Xfermode只有一个子类:PorterDuffXfermode
PorterDuffXfermode控制图像的混合模式,影响的是2个图层交集区域的显示方式。
Dst遮罩图片,Src原图片
package com.example.roundphotoview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import com.github.chrisbanes.photoview.PhotoView;
public class RoundPhotoView extends PhotoView {
private float radius = 0;
private Paint paint;
public RoundPhotoView(Context context) {
this(context, null);
}
public RoundPhotoView(Context context, AttributeSet attr) {
super(context, attr);
init();
}
private void init() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(getResources().getColor(R.color.colorAccent));
setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
public void setRadius(float radius) {
this.radius = radius;
postInvalidate();
}
private Bitmap getDstBitmap() {
Bitmap dstBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dstBitmap);
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), radius, radius, new Paint(Paint.ANTI_ALIAS_FLAG));
return dstBitmap;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(getDstBitmap(), null, new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), paint);
paint.setXfermode(null);
canvas.restore();
}
}