制作圆形SupportMapFragment

问题描述 投票:0回答:1

在 Android API 28 上,使用 Kotlin,我尝试将

SupportMapFragment
设为圆形,这样我就可以使其周围有动画,但是,当我尝试将
clipToOutline
设为 true 时,它仍然保持正方形。我怎样才能把它变成一个圆圈?谢谢!

//截图预览

//XML

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/customerMapView"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginTop="16dp"
    android:background="@drawable/circle_mask"
    android:clipToOutline="true"
    android:contentDescription="@string/customer_map_view"
    app:layout_constraintEnd_toEndOf="@id/pulsatingCircle"
    app:layout_constraintStart_toStartOf="@id/pulsatingCircle"
    app:layout_constraintTop_toTopOf="@id/pulsatingCircle" />

//circle_mask

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" />
    <item>
        <shape android:shape="oval">
            <size
                android:width="300dp"
                android:height="300dp" />
        </shape>
    </item>
</layer-list>

// Kotlin 代码

private fun initMap() {
    val mapView = supportFragmentManager.findFragmentById(R.id.customerMapView) as SupportMapFragment

    mapView.view?.outlineProvider = ViewOutlineProvider.BACKGROUND
    mapView.view?.clipToOutline = true
}

我尝试在 xml 和 Kotlin 文件中将

clipToOutline
设置为 true,但在 xml 中,我需要使用 API 32。

android kotlin supportmapfragment
1个回答
0
投票

您可以使用 CardView。

由于宽度和高度是固定的,因此您可以传递特定的角半径,使其看起来像圆形,然后就完成了!

<com.google.android.material.card.MaterialCardView
        android:id="@+id/mapCardLayout"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:cardBackgroundColor="@android:color/transparent"
        app:cardCornerRadius="100dp"
        app:cardElevation="0dp">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/customerMapView"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </com.google.android.material.card.MaterialCardView>

如果您没有特定的宽度或高度,那么您可以使用具有相同宽度高度的自定义视图来获得像这样的正确圆圈,

import android.content.Context
import android.util.AttributeSet
import com.google.android.material.card.MaterialCardView

class CircleCardView : MaterialCardView {
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec)
    }
}

对于圆形外观,创建自定义样式属性并将其与卡片视图一起使用,如下所示,

style.xml

<style name="CustomCardCornerStyle" parent="@style/Widget.MaterialComponents.CardView">
        <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay_card_corners</item>
    </style>
    
    <style name="ShapeAppearanceOverlay_card_corners" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">50%</item>
    </style>

在你的

layout.xml

<com.demo.motiondemo.CircleCardView
        android:id="@+id/mapCardLayout"
        style="@style/CustomCardCornerStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@android:color/transparent"
        app:cardElevation="0dp">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/customerMapView"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </com.demo.motiondemo.CircleCardView>
© www.soinside.com 2019 - 2024. All rights reserved.