Android - CircleView内的Google地图

时间:2016-02-26 08:40:26

标签: android google-maps android-canvas android-custom-view android-maps-v2

我想在圆圈视图中显示地图,其中圆圈的外部区域充满了颜色。我提到了一篇帖子Draw transparent circle filled outside。但现在问题是触摸事件。可以通过外部圆形视图触摸地图,而我需要在圆形视图内部(地图可见的地方)触摸(缩放或移动)地图。

我尝试了什么,

  1. 的setEnabled =假
  2. 可点击=假
  3. 但仍然从外部圆圈视图触摸地图。

    是否可以实现从圆圈内部触摸该地图。

    public class RadiusOverlayView extends LinearLayout {
        private Bitmap windowFrame;
    
        public RadiusOverlayView(Context context) {
            super(context);
        }
    
        public RadiusOverlayView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public RadiusOverlayView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public RadiusOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            super.dispatchDraw(canvas);
    
            if (windowFrame == null) {
                createWindowFrame(); // Lazy creation of the window frame, this is needed as we don't know the width & height of the screen until draw time
            }
            canvas.drawBitmap(windowFrame, 0, 0, null);
        }
    
        @Override
        public boolean isEnabled() {
            return false;
        }
    
        @Override
        public boolean isClickable() {
            return false;
        }
    
        protected void createWindowFrame() {
            windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); // Create a new image we will draw over the map
            Canvas osCanvas = new Canvas(windowFrame); // Create a   canvas to draw onto the new image
    
            RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight());
    
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // Anti alias allows for smooth corners
            paint.setColor(Color.CYAN); // This is the color of your activity background
            osCanvas.drawRect(outerRectangle, paint);
    
            //paint.setColor(Color.TRANSPARENT); // An obvious color to help debugging
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); // A out B http://en.wikipedia.org/wiki/File:Alpha_compositing.svg
            float centerX = getWidth() / 2;
            float centerY = getHeight() / 2;
            float radius = Math.min(getWidth(), getHeight()) / 2 - 50;
            osCanvas.drawCircle(centerX, centerY, radius, paint);
        }
    
        @Override
        public boolean isInEditMode() {
            return true;
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
            windowFrame = null; // If the layout changes null our frame so it can be recreated with the new width and height
        }
    }
    


    XML布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">
        <!--loading map in container-->
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
        <mypackage.RadiusOverlayView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            />
    </RelativeLayout>
    

    结果: enter image description here

    任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以为View.OnTouchListener设置RadiusOverlayView并计算RadiusOverlayView是否需要管理触摸事件。 在这个例子中,我通过测试触摸的RadiusOverlayView颜色是否为!= 0(也许你想改进它)来计算:

final RadiusOverlayView radiusOverlayView = (RadiusOverlayView) findViewById(R.id.radiusView);
radiusOverlayView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        view.setDrawingCacheEnabled(true);
        Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache());
        view.setDrawingCacheEnabled(false);

        return bmp.getPixel((int) motionEvent.getX(), (int) motionEvent.getY()) != 0;
    }
});