答案 0 :(得分:2)
您可以使用Parent3
创建此自定义形状。下面是一个工作示例。将<layer-list>
放入custom_triangular_shape.xml
文件夹。
<强> custom_triangular_shape.xml 强>
res/drawable
使用:强>
<?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>
<强>输出:强>
希望这会有所帮助〜
答案 1 :(得分:2)
您可以使用材料成分库来创建自定义shapes。
该库提供了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);
对于边缘处理,父视图还必须通过
在xml中设置android:clipChildren="false"
。如果在父级上存在任何可能与阴影相交的填充,则clipToPadding
也可能需要false
。
答案 2 :(得分:2)
这可以使用 MaterialCardView
和 Shape theming 来实现。
依赖:(使用 latest stable version)
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>
结果:
答案 3 :(得分:1)
试试这个:
对于三角形:
<?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>
在布局中使用两个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>
答案 4 :(得分:0)
您可以使用图层列表。在底部创建一个三角形形状,然后创建一个矩形形状作为下一层,并给出与三角形高度匹配的底部边距。
这是制作三角形的样本。 https://stackoverflow.com/a/18421795/1987045
答案 5 :(得分:0)
您可以使用9patch作为自定义布局的背景。
答案 6 :(得分:0)
使用PopUpWindow即可实现目标。 Here是一个很好的链接。