setMeasuredDimension(width, height);
/根据画布尺寸生成相同尺寸的背景图/
newBgBitmap = clipBitmap(bgBitmap, width, height);
/根据新的背景图生成填充部分/
srcBitmap = createSmallBitmap(newBgBitmap);
}
设置画笔的混合模式,生成一张自定义形状的图片供填充部分使用
public Bitmap createSmallBitmap(Bitmap var) {
Bitmap bitmap = Bitmap.createBitmap(shadowSize, shadowSize, Bitmap.Config.ARGB_8888);
Canvas canvas1 = new Canvas(bitmap);
canvas1.drawCircle(shadowSize / 2, shadowSize / 2, shadowSize / 2, paintSrc);
/设置混合模式/
paintSrc.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/在指定范围随机生成空缺部分坐标,保证空缺部分出现在View右侧/
int min = width / 3;
int max = width - shadowSize / 2 - padding;
Random random = new Random();
shadowLeft = random.nextInt(max) % (max - min + 1) + min;
Rect rect = new Rect(shadowLeft, (height - shadowSize) / 2, shadowSize + shadowLeft, (height + shadowSize) / 2);
RectF rectF = new RectF(0, 0, shadowSize, shadowSize);
canvas1.drawBitmap(var, rect, rectF, paintSrc);
paintSrc.setXfermode(null);
return bitmap;
}
在onDraw()方法中依次画出背景图、空缺部分、填充部分,注意先后顺序(具体细节自行处理,例如阴影、凹凸感等等)
@Override
protected void onDraw(Canvas canvas) {
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】
super.onDraw(canvas);
RectF rectF = new RectF(0, 0, width, height);
/画背景图/
canvas.drawBitmap(newBgBitmap, null, rectF, paintSrc);
bgPaint.setColor(Color.parseColor(“#000000”));
/画空缺部分周围阴影/
canvas.drawCircle(shadowLeft + shadowSize / 2, height / 2, shadowSize / 2, bgPaint);
/画空缺部分/
canvas.drawCircle(shadowLeft + shadowSize / 2, height / 2, shadowSize / 2, paintShadow);
Rect rect = new Rect(srcLeft, (height - shadowSize) / 2, shadowSize + srcLeft, (height + shadowSize) / 2);
bgPaint.setColor(Color.parseColor(“#FFFFFF”));
/画填充部分周围阴影/
canvas.drawCircle(srcLeft + shadowSize / 2, height / 2, shadowSize / 2, bgPaint);
/画填充部分/
canvas.drawBitmap(srcBitmap, null, rect, paintSrc);
}
package com.example.qingfengwei.myapplication;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
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.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import java.util.Random;
public class SlidingVerificationView extends View {
private Bitmap bgBitmap;
private Bitmap newBgBitmap;
private Bitmap srcBitmap;
private Paint paintShadow;
private Paint paintSrc;
private float curX;
private float lastX;
private int dx;
private int shadowSize = dp2px(60);
private int padding = dp2px(40);
private int shadowLeft;
private int srcLeft = padding;
private int width, height;
private Paint bgPaint;
private OnVerifyListener listener;
public SlidingVerificationView(Context context) {
this(context, null);
}
public SlidingVerificationView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlidingVerificationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paintShadow = new Paint();
paintShadow.setAntiAlias(true);
paintShadow.setColor(Color.parseColor(“#AA000000”));
paintSrc = new Paint();
paintSrc.setAntiAlias(true);
paintSrc.setFilterBitmap(true);
paintSrc.setStyle(Paint.Style.FILL_AND_STROKE);
paintSrc.setColor(Color.WHITE);
bgPaint = new Paint();
bgPaint.setMaskFilter(new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER));
bgPaint.setAntiAlias(true);
bgPaint.setStyle(Paint.Style.FILL);
bgBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.syzt);
}
public void setVerifyListener(OnVerifyListener listener) {
this.listener = listener;
}
public Bitmap clipBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
}
public Bitmap createSmallBitmap(Bitmap var) {
Bitmap bitmap = Bitmap.createBitmap(shadowSize, shadowSize, Bitmap.Config.ARGB_8888);
Canvas canvas1 = new Canvas(bitmap);
canvas1.drawCircle(shadowSize / 2, shadowSize / 2, shadowSize / 2, paintSrc);
/设置混合模式/
paintSrc.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/在指定范围随机生成空缺部分坐标,保证空缺部分出现在View右侧/
int min = width / 3;
int max = width - shadowSize / 2 - padding;
Random random = new Random();
shadowLeft = random.nextInt(max) % (max - min + 1) + min;
Rect rect = new Rect(shadowLeft, (height - shadowSize) / 2, shadowSize + shadowLeft, (height + shadowSize) / 2);
RectF rectF = new RectF(0, 0, shadowSize, shadowSize);
canvas1.drawBitmap(var, rect, rectF, paintSrc);
paintSrc.setXfermode(null);
return bitmap;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
curX = event.getRawX();
switch (event.getAction()) {