如何在外面创建一个正方形的drawable并且内部有圆角?

时间:2011-10-31 22:55:33

标签: android android-layout

我正在尝试在MapView上创建圆角,并且由于默认情况下似乎没有任何方法可以执行此操作,因此我基本上在地图视图上覆盖了背景布局,如下所示:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" >

<RelativeLayout
    android:id="@+id/map_holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@drawable/panel_rounded_corner_transparent" />
</RelativeLayout>

我的圆角drawable是这样定义的:

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:drawable="@drawable/bg_rounded_corner_transparent" />
</selector>

并且drawable inside定义为:

<layer-list
  xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape>

      <solid
        android:color="@color/transparent" />
      <stroke
        android:width="1dp"
        android:color="@color/darkgray" />
      <corners
        android:radius="5dp" />
    </shape>
  </item>

</layer-list>

然而,问题在于,由于地图最终呈矩形而边框呈圆角,因此地图的角落从我临时边框的角落后面窥视。如何仅在边框外部设置背景颜色,同时保持面板内部透明?

澄清一下,这里有一些截图。

此屏幕截图显示最初由重叠边框“限制”的地图:

此屏幕截图用红色背景替换地图,以便更清楚地了解问题所在:

如您所见,红色(以及扩展名,地图)在边界外流血。

我可以在地图中添加1dp填充,但这并不能完全解决问题,如您所见:

enter image description here

由于角落是圆角的,因此部分地图仍会漏掉。它比第一个选项好很多,但并不完美 - 角落处有1个像素点。

如截图所示,超过1dp的填充不是解决方案,因为它完全会产生另一个问题:

enter image description here

4 个答案:

答案 0 :(得分:3)

尝试扩展MapView,如下所示:

private class MyMapView extends MapView {

    public MyMapView(Context context, String apiKey) {
        super(context, apiKey);
    }

    @Override
    public void draw(Canvas canvas) {
        Path path = new Path();
        RectF r = new RectF(0, 0, this.getWidth(), this.getHeight()); 
        path.addRoundRect(r, 12, 12, Path.Direction.CW);
        canvas.clipPath(path);
        super.draw(canvas);
    }
}

您可能需要调整path.addRoundRect()

的半径

答案 1 :(得分:0)

您是否尝试过使用可设置样式的元素?看看这个:

http://developer.android.com/reference/android/R.styleable.html#DrawableCorners_bottomLeftRadius

希望这会有所帮助,这可以解决您的问题:)

答案 2 :(得分:0)

嗨,我在这里玩了几个小时,这是我的ImageView的解决方案,内部有透明框架(椭圆形),外面是纯色。我知道它是椭圆形的,但它也适用于rect。

实现一个内部有两个子节点的FrameLayout。因此形状将与ImageView重叠:

<FrameLayout
        android:id="@+id/testLinearLayout"
        android:layout_width="300dp"
        android:layout_height="300dp">

        <ImageView
            android:id="@+id/mainContentImage"
            android:layout_width="300dp"
            android:layout_height="300dp"/>

        <LinearLayout
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:background="@drawable/shape_circle">
        </LinearLayout>
</FrameLayout>

这是shape_circle.xml

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

shape_circle_rect.xml

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding 
        android:left="-70dp"
        android:top="-70dp"
        android:right="-70dp"
        android:bottom="-70dp"/>

</shape>

shape_circle_oval.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <stroke android:color="#ffffff" android:width="70dp"/>
</shape>

它不是完全你要搜索的内容,但它可以提供帮助。

答案 3 :(得分:0)

希望这是woking ........阅读关于样式和开发人员的其他部分

可以帮到你

http://developer.android.com/reference/android/R.style.html