Фрагмент карты Google с закругленными углами [дубликат]

Как насчет использования следующего регулярного выражения:

(?<=My cow\s).*?(?=\smilk)
7
задан Emil Adz 23 January 2013 в 06:13
поделиться

7 ответов

Я не пробовал это, но я бы поставил представление с закругленными углами и прозрачной серединой поверх mapView / mapFragment.

То есть, поместите mapFragment и закругленный угловой вид в FrameLayout с заполнением FrameLayout, затем сделайте середину округленного углового вида прозрачным.

Для дальнейшего уточнения вы можете сделать это в макете следующим образом: -

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rounded_background"
    android:orientation="vertical" >
</LinearLayout>

</FrameLayout>

Rounded_background - это 9-патч с закругленными углами и прозрачной средой. Например,

rounded_background.9.png [/g0]

Надеюсь, что это помогает,

Райан

6
ответ дан Ryan 21 August 2018 в 08:13
поделиться
  • 1
    что вы подразумеваете под позицией? какой вид? и как сделать середину прозрачной? – Emil Adz 23 January 2013 в 00:43
  • 2
    см. дальнейшие комментарии, спасибо ryan – Ryan 23 January 2013 в 01:08
  • 3
    Я отредактировал сообщение с результатом. взглянуть. – Emil Adz 23 January 2013 в 01:30
  • 4
    Я просто сделал очень грубый 9 патч, чтобы дать вам эту идею, не собирался использовать ее, как есть ;-) Если вы сделаете приличный актив, все будет хорошо. – Ryan 23 January 2013 в 01:37
  • 5
    Кроме того, вам нужно использовать его как девять патчей, переименуйте его filename.9.png. Подробнее см. Здесь radleymarx.com/blog/simple-guide-to-9-patch – Ryan 23 January 2013 в 01:39

Для других людей, изучающих это, я только что рассмотрел это с помощью GoogleMap.snapshot и обработал результат растрового изображения с помощью этого теста над потоком: Как сделать ImageView с закругленными углами?

Имейте в виду, что это допустимо только в том случае, если вы собираетесь иметь статическую карту, с которой не будет взаимодействовать.

Убедитесь, что вы сделали снимок после загрузки карты.

Я обновил код помощника изображения, чтобы рисовать с помощью пути для поддержки округления только некоторых углов. то есть. Если вы хотите округлить только 2 из углов.

Вам просто нужна функция round round rect, которая принимает float []

. Я показываю индикатор выполнения, пока не получаю обратный вызов из GoogleMap загрузил прослушиватель, чем я делаю снимок.

Если вы сделаете снимок слишком рано, вы получите не сможете создать растровое изображение с ошибкой ширины и высоты 0.

Надеюсь, это поможет кому-то, кто ищет для закругленных углов или другой странной формы в моментальном снимке статической карты.

0
ответ дан Community 21 August 2018 в 08:13
поделиться

После сообщения @Nouman_Hanif я получил решение, которое выглядит неплохо.

map_rounded_corner_overlay.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <stroke android:width="1dp"
          android:color="@color/white" />
  <corners android:radius="<your_desired_view_corner_radius>"/>
</shape>

Мой файл карты XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
  <fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_margin="1dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  <ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/map_rounded_corner_overlay" />
</RelativeLayout>
0
ответ дан Gustavo Baiocchi Costa 21 August 2018 в 08:13
поделиться

Если вы пытаетесь настроить таргетинг на API 21 (Lollipop) и выше


Это самый простой способ.

parentView.setClipToOutline(true);

Результат

0
ответ дан Michael 21 August 2018 в 08:13
поделиться
  • 1
    Что такое «parentView»? Я попытался установить setClipToOutline (true); к фактическому MapFragment, но это не работает для меня ... – EZDsIt 12 June 2016 в 13:46
  • 2
    parentView - это представление, в котором находится mapFragment. Это представление, в котором есть mapFragment внутри него. – Michael 13 June 2016 в 18:40
  • 3
    Не работает для меня ... Я завернул фрагмент карты LinearLayout с круглым фоном угла и назвал setClipToOutline (true); как вы предположили. Возможно, это имеет какое-то отношение к теме, которую я использую, которая является «Theme.Translucent.NoTitleBar.Fullscreen» ...? – EZDsIt 14 June 2016 в 18:47

Самый простой способ - обернуть фрагмент карты внутри FrameLayout вместе с ImageView. Изображение будет отображать закругленный прямоугольник поверх фрагмента карты. В его простейшей форме вы увидите фрагмент карты внутри закругленного прямоугольника с его углами, торчащими из закругленного прямоугольника, потому что сам вид карты не закруглен. Чтобы преодолеть эту визуальную странность, просто примените значение layout_margin на фрагменте карты. Значение должно быть равно ширине границы прямоугольника.

   <FrameLayout
    android:id="@+id/map_container"
    android:layout_width="wrap_content"
    android:layout_height="340dp" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="3dp"
        android:name="com.google.android.gms.maps.SupportMapFragment"/>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/map_bg_box" />

</FrameLayout>

Выравниваемый прямоугольник определяется как форма xml, как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <stroke android:width="3dp"
    android:color="#ff000000" />

    <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp"
    android:topLeftRadius="7dp" android:topRightRadius="7dp"/>

</shape>

Обратите внимание, что ширина штриха прямоугольника равна 3dp, что является точно таким же значением, которое мы применяли к Свойство layout_margin фрагмента карты. В результате получается красиво округленный фрагмент карты, как показано на скриншоте ниже

4
ответ дан Nouman Hanif 21 August 2018 в 08:13
поделиться
  • 1
    Это не сработало для меня. Я пробовал все, но это не так. – KinGPinG 14 August 2016 в 12:51
  • 2
    какой результат вы получили после выполнения описанного здесь решения? – Nouman Hanif 15 August 2016 в 23:18
  • 3
    Уголки карты перекрывают черную округлую форму: карта выходит за пределы формы. – KinGPinG 25 August 2016 в 17:33
  • 4
    @KinGPinG, вы уверены, что правильный порядок размещения фигур? – Muhammed Refaat 16 May 2017 в 11:10

Я знаю, что это старый пост, но вы можете попробовать использовать Карты следующим образом:

<android.support.v7.widget.CardView
    android:layout_width="300dp"
    android:layout_height="350dp"
    android:layout_gravity="center_horizontal|center_vertical"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="20dp"
    app:cardCornerRadius="12dp"
    app:cardElevation="12dp">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v7.widget.CardView>

7
ответ дан Stephen 21 August 2018 в 08:13
поделиться
  • 1
    Действительно, сегодня вы можете использовать карты для этого. Когда этот вопрос был задан, Карты еще не существовали. Отличный ответ. – Emil Adz 3 September 2017 в 11:06

Оберните фрагмент карты в этом макете:

package com.example.yourpackage;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

/**
 * Just extend any Layout you like/need
 */
public class RoundedLayout extends RelativeLayout {

private Path mPathCorners = new Path();
private Path mPathCircle = new Path();
private float mCornerRadius;

/**
 * border path
 */
private Path mPathCornersBorder = new Path();
private Path mPathCircleBorder = new Path();
private int mBorderWidth = 0;
private int mBorderHalf;
private boolean mShowBorder = false;
private int mBorderColor = 0xFFFF7700;

private float mDensity = 1.0f;

/**
 * Rounded corners or circle shape
 */
private boolean mIsCircleShape = false;

private Paint mPaint = new Paint();

private float dpFromPx(final float px) {
    return px / mDensity;
}

private float pxFromDp(final float dp) {
    return dp * mDensity;
}

public RoundedLayout(Context context) {
    this(context, null);
}

public RoundedLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public RoundedLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mDensity = getResources().getDisplayMetrics().density;
    // just a default for corner radius
    mCornerRadius = pxFromDp(25f);

    mPaint.setAntiAlias(true);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setColor(mBorderColor);
    setBorderWidth(Math.round(pxFromDp(2f)));
}

/**
 * Switch to circle or rectangle shape
 *
 * @param useCircle
 */
public void setShapeCircle(boolean useCircle) {
    mIsCircleShape = useCircle;
    invalidate();
}

/**
 * change corner radius
 *
 * @param radius
 */
public void setCornerRadius(int radius) {
    mCornerRadius = radius;
    invalidate();
}

public void showBorder(boolean show) {
    mShowBorder = show;
    invalidate();
}

public void setBorderWidth(int width) {
    mBorderWidth = width;
    mBorderHalf = Math.round(mBorderWidth / 2);
    if (mBorderHalf == 0) {
        mBorderHalf = 1;
    }

    mPaint.setStrokeWidth(mBorderWidth);
    updateCircleBorder();
    updateRectangleBorder();
    invalidate();
}

public void setBorderColor(int color) {
    mBorderColor = color;
    mPaint.setColor(color);
    invalidate();
}

// helper reusable vars, just IGNORE
private float halfWidth, halfHeight, centerX, centerY;
private RectF rect = new RectF(0, 0, 0, 0);
private RectF rectBorder = new RectF(0, 0, 0, 0);

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    // just calculate both shapes, is not heavy

    // rounded corners path
    rect.left = 0;
    rect.top = 0;
    rect.right = w;
    rect.bottom = h;
    mPathCorners.reset();
    mPathCorners.addRoundRect(rect, mCornerRadius, mCornerRadius, Path.Direction.CW);
    mPathCorners.close();

    // circle path
    halfWidth = w / 2f;
    halfHeight = h / 2f;
    centerX = halfWidth;
    centerY = halfHeight;
    mPathCircle.reset();
    mPathCircle.addCircle(centerX, centerY, Math.min(halfWidth, halfHeight), Path.Direction.CW);
    mPathCircle.close();

    updateRectangleBorder();
    updateCircleBorder();
}

// helper reusable var, just IGNORE
private int save;

@Override
protected void dispatchDraw(Canvas canvas) {
    save = canvas.save();
    canvas.clipPath(mIsCircleShape ? mPathCircle : mPathCorners);
    super.dispatchDraw(canvas);
    canvas.restoreToCount(save);

    if (mShowBorder) {
        canvas.drawPath(mIsCircleShape ? mPathCircleBorder : mPathCornersBorder, mPaint);
    }
}

private void updateCircleBorder() {
    // border path for circle
    mPathCircleBorder.reset();
    mPathCircleBorder.addCircle(centerX, centerY, Math.min(halfWidth - mBorderHalf,
            halfHeight - mBorderHalf), Path.Direction.CW);
    mPathCircleBorder.close();
}

private void updateRectangleBorder() {
    // border path for rectangle
    rectBorder.left = rect.left + mBorderHalf;
    rectBorder.top = rect.top + mBorderHalf;
    rectBorder.right = rect.right - mBorderHalf;
    rectBorder.bottom = rect.bottom - mBorderHalf;
    mPathCornersBorder.reset();
    mPathCornersBorder.addRoundRect(rectBorder, mCornerRadius - mBorderHalf, mCornerRadius -
            mBorderHalf, Path.Direction.CW);
    mPathCornersBorder.close();
}
}

В макете будет выглядеть так:

<com.example.yourpackage.RoundedLayout
    android:id="@+id/maplayout"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_margin="20dp">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        tools:context="com.example.yourpackage.MapsMarkerActivity"/>
</com.example.yourpackage.RoundedLayout>

В коде может быть как круглый, с рамкой :

    RoundedLayout rl = (RoundedLayout) findViewById(R.id.maplayout);
    rl.setShapeCircle(true);
    rl.showBorder(true);
    rl.setBorderWidth(2);

Этот макет можно использовать для формирования любого вида.

Невероятно, как Google не способен создавать полноценные демо-версии для API android.

1
ответ дан ValentinP 21 August 2018 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: