App要做功能引导,难点就是ICON图标的挖空高亮处理
public static void show(Activity activity, View anchorView, View.OnClickListener onClickListener) {
if(anchorView==null){
return;
}
ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView().getRootView();
Rect rect = new Rect();
anchorView.getGlobalVisibleRect(rect);
View overlayView = activity.getLayoutInflater().inflate(R.layout.overlay_guide_search, rootView, false);
View vTip = overlayView.findViewById(R.id.ivTip);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) vTip.getLayoutParams();
layoutParams.topMargin = rect.bottom + SizeUtils.dp2px(20);
rootView.addView(overlayView);
overlayView.post(new Runnable() {
@Override
public void run() {
// 设置 OverlayView 的图层类型为 SOFTWARE
overlayView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 在 OverlayView 上绘制透明洞
final int holeRadius = SizeUtils.dp2px(22); // 洞的半径
final int centerX = rect.centerX(); // 圆心的 X 坐标
final int centerY = rect.centerY(); // 圆心的 Y 坐标
overlayView.setWillNotDraw(false); // 设置为允许绘制
overlayView.invalidate(); // 请求重绘
overlayView.setDrawingCacheEnabled(true); // 启用绘制缓存
overlayView.buildDrawingCache(); // 构建绘制缓存
Bitmap overlayBitmap = overlayView.getDrawingCache(); // 获取绘制缓存的位图
Canvas canvas = new Canvas(overlayBitmap); // 创建用于绘制的 Canvas
// 绘制透明洞
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawCircle(centerX, centerY, holeRadius, paint);
// 设置绘制好的位图为 OverlayView 的背景
overlayView.setBackground(new BitmapDrawable(activity.getResources(), overlayBitmap));
overlayView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
// 判断点击位置是否在洞的范围内
boolean isInsideHole = Math.pow(touchX - centerX, 2) + Math.pow(touchY - centerY, 2) <= Math.pow(holeRadius, 2);
if (isInsideHole) {
// 在洞的范围内,处理点击事件
onClickListener.onClick(v);
rootView.removeView(overlayView);
return true;
}
rootView.removeView(overlayView);
return true;
}
});
}
});
}