Я хотел показать карту внутри круга, где внешняя область круга заполнена цветом. Я сослался на пост Draw transparent circle filled outside. Но теперь проблема касательно событий. Карту можно коснуться через внешний вид круга, в то время как мне нужна карта, можно коснуться (масштабировать или перемещать) только форму внутри круга (где видна карта).Android - Карты Google внутри CircleView
То, что я пытался,
- setEnabled = ложь
- интерактивная = ложь
, но до сих пор карта прикоснулась от постороннего взгляда круга.
Возможно ли, чтобы эта карта могла быть затронута изнутри.
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>
Любая помощь будет оценена.
Просто уточнить, если я вернусь ложь всегда его не допускать, чтобы двигаться правильно? – Bharatesh
Нет, если вы всегда возвращаете true, карта не будет перемещаться. Возвращение true означает, что слушатель RadiusOverlayView поглотил событие, избегая его распространения на карту. – antonio
Я эта логика работает. Единственная трудная вещь - найти x y (круглую форму) внутри/вне круга и вернуть логическое значение. Можете ли вы дать какое-либо представление об этом, чтобы я мог убедиться, что касание произошло за пределами области круга. – Bharatesh