2

Я хотел показать карту внутри круга, где внешняя область круга заполнена цветом. Я сослался на пост Draw transparent circle filled outside. Но теперь проблема касательно событий. Карту можно коснуться через внешний вид круга, в то время как мне нужна карта, можно коснуться (масштабировать или перемещать) только форму внутри круга (где видна карта).Android - Карты Google внутри CircleView

То, что я пытался,

  1. setEnabled = ложь
  2. интерактивная = ложь

, но до сих пор карта прикоснулась от постороннего взгляда круга.

Возможно ли, чтобы эта карта могла быть затронута изнутри.

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

Любая помощь будет оценена.

ответ

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

Просто уточнить, если я вернусь ложь всегда его не допускать, чтобы двигаться правильно? – Bharatesh

+0

Нет, если вы всегда возвращаете true, карта не будет перемещаться. Возвращение true означает, что слушатель RadiusOverlayView поглотил событие, избегая его распространения на карту. – antonio

+0

Я эта логика работает. Единственная трудная вещь - найти x y (круглую форму) внутри/вне круга и вернуть логическое значение. Можете ли вы дать какое-либо представление об этом, чтобы я мог убедиться, что касание произошло за пределами области круга. – Bharatesh