2

我想为谷歌地图制作自定义信息窗口,我可以制作它,但我无法制作三角形波纹管布局。我可以在那里添加图像,但布局在外线上有阴影。任何人都建议我该怎么做。如何在红色区域内制作部分。如您所见,外部布局有阴影。

在此处输入图像描述

4

7 回答 7

4

您可以使用材料组件库来创建自定义形状
该库提供了TriangleEdgeTreatment创建给定大小的三角形处理的方法,该三角形处理相对于形状面向内或向外。

你可以使用类似的东西:

TriangleEdgeTreatment triangleEdgeTreatment = new TriangleEdgeTreatment(radius,false);

LinearLayout linearLayout= findViewById(R.id.xxxx);
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
    .toBuilder()
    .setBottomEdge(triangleEdgeTreatment)
    .build();

MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable(shapeAppearanceModel);
ViewCompat.setBackground(linearLayout,shapeDrawable);

在此处输入图像描述

android:clipChildren="false"同样对于边缘处理,父视图必须通过在 xml 中设置来禁用子视图的剪辑。如果父级上有任何可能与阴影相交的填充,也可能clipToPadding需要这样做。false

于 2020-01-28T08:54:00.050 回答
3

您可以使用创建此自定义形状<layer-list>。下面是一个工作示例。放入custom_triangular_shape.xml你的res/drawable文件夹。

custom_triangular_shape.xml

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

    <!-- Transparent Rectangle -->
    <item>
        <shape android:shape="rectangle">
            <size
                android:width="300dp"
                android:height="80dp" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <!-- Colored Rectangle -->
    <item
        android:bottom="20dp">
        <shape android:shape="rectangle">
            <corners
                android:radius="4dp">

            </corners>
            <size
                android:width="300dp"
                android:height="80dp" />
            <solid android:color="#FFFFFF" />
        </shape>
    </item>

    <!-- Bottom Triangle -->
    <item
        android:left="90dp"
        android:right="110dp"
        android:top="0dp"
        android:bottom="30dp">
        <rotate android:fromDegrees="45">
            <shape android:shape="rectangle">
                <solid android:color="#FFFFFF" />
            </shape>
        </rotate>
    </item>

</layer-list>

利用:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_triangular_shape">

</LinearLayout>

输出:

在此处输入图像描述

希望这会有所帮助~

于 2017-05-02T13:11:58.023 回答
3

这可以使用MaterialCardViewShape 主题来实现。

依赖:(使用最新的稳定版本

def materialVersion = '1.3.0'

implementation "com.google.android.material:material:$materialVersion"

布局:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/backgroundWhite"
        app:cardElevation="4dp"
        app:cardCornerRadius="8dp">

        //Content layout here          

    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
        style="@style/PointerCardViewStyle"
        android:layout_width="20dp"
        android:layout_height="10dp"
        app:cardBackgroundColor="@color/whiteColor"
        android:layout_gravity="center"
        app:cardElevation="4dp" />
</LinearLayout>

风格:

<style name="PointerCardViewStyle" parent="Widget.MaterialComponents.CardView">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlayPointerCardView</item>
</style>

<style name="ShapeAppearanceOverlayPointerCardView" parent="@style/Widget.MaterialComponents.CardView">
    <item name="cornerFamily">cut</item>
    <item name="cornerSizeTopRight">0dp</item>
    <item name="cornerSizeTopLeft">0dp</item>
    <item name="cornerSizeBottomRight">10dp</item>
    <item name="cornerSizeBottomLeft">10dp</item>
</style>

结果:

结果

于 2021-03-25T07:57:38.983 回答
2

尝试这个:

对于三角形:

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <rotate
            android:fromDegrees="45"
            android:pivotX="-40%"
            android:pivotY="87%"
            android:toDegrees="45">
            <shape android:shape="rectangle">
                <stroke
                    android:width="10dp"
                    android:color="@android:color/transparent" />
                <solid android:color="#000000" />
            </shape>
        </rotate>
    </item>
</layer-list>

对于矩形:

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#B2E3FA" />
        </shape>
    </item>
</layer-list>

在 Layout 中同时使用 xml:

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

    <RelativeLayout
        android:id="@+id/rlv1"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:background="@drawable/rectringle" />
    <RelativeLayout
        android:id="@+id/rlv2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_below="@+id/rlv1"
        android:layout_marginLeft="30dp"
        android:background="@drawable/tringle"
        android:rotation="180" />
</LinearLayout>
于 2017-05-02T12:54:44.630 回答
0

您可以使用图层列表。在底部创建一个三角形,然后创建一个矩形作为下一层,并提供与三角形高度相匹配的底部边距。

这是一个制作三角形的样本。https://stackoverflow.com/a/18421795/1987045

于 2017-05-02T12:23:56.613 回答
-1

使用PopUpWindow可以实现您的目标。是一个很好的链接。

于 2017-05-02T12:29:22.727 回答
-1

您可以使用9patch作为自定义布局的背景。

于 2017-05-02T12:25:33.640 回答