Android App 页面挖空高亮

72 阅读1分钟

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;
                }
            });
        }
    });


}