2011-10-31 59 views
0

我想上一个MapView创建圆角,并且因为似乎没有什么办法在默认情况下做到这一点,我基本上覆盖布局与背景在我的地图视图,像这样:如何创建一个外部呈方形并且里面有圆角的drawable?

<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> 

我圆角绘制的定义是这样的:

<?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> 

和绘制内部被定义为:

<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

+1

您可以发布它的屏幕截图? – FoamyGuy

+0

使用填充。因此,地图视图将保留在您的界限内 – blessenm

+0

用一些照片更新了帖子。 Blessenm,我在发布原始问题后不久就想到了你的建议,但这并不能完全解决我的问题。 – Catherine

回答

2

尝试延长的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()

+0

这很好用 –

0

嗨,我玩这里几个小时左右,这里是我的解决方案ImageView与transp内部没有框架(椭圆形),外部是纯色。我知道这是一个椭圆形,但它也适用于矩形。

实现与内部两个孩子的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> 

它不是完全是你在寻找什么,但它可以帮助。