2013-01-12 55 views
1

我試圖展現一個MapView在Android上進行了一圈就這樣掩蓋的MapView:裁剪/ Android上

protected void onDraw(Canvas canvas) { 
    Path path = new Path(); 
    path.addCircle(400,200,100,Direction.CW); 
    canvas.clipPath(path); 
    super.onDraw(canvas); 
} 

不幸的MapView(V2:com.google.android.gms.maps.MapView)成分似乎忽略這一點,而不是僅僅考慮該圓的邊界/ RECT繪製地圖:(

我一直在尋找了一段時間的網絡,現在,沒有找到應該是一個很好的解決方案。

這甚至可能嗎?(該布倫德爾解決方案不適合我,因爲我希望背景可見圓地圖)

謝謝!

回答

7

Android支持自API級別11以來的硬件加速。問題在於,硬件加速打開時並不支持所有的繪圖操作。而Canvas.clipPath就是其中之一。可以找到不支持的操作的完整列表here

您可以嘗試實現你想要的而不使用clipPath或只是禁用硬件加速。

要禁用應用程序級硬件加速確保您有targetSdkVersion 11或更高版本,並在AndroidManifest使用hardwareAccelerated標籤:

<application android:hardwareAccelerated="false" ...> 

只能使用下面的方法將特定視圖禁用硬件加速。

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void enableHardwareAcceleration(View view, boolean enabled) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     if (enabled) { 
      view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
     } else { 
      view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
    } 
} 

請注意,你必須使用TargetApi註釋和檢查設備的Android版本爲Honeycomb或更高,否則Eclipse可能會產生一個錯誤。

如果從你的問題的代碼不工作嘗試用它來取代它:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    Path path = new Path(); 
    int count = canvas.save(); 

    path.addCircle(400,200,100,Direction.CW); 

    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
    canvas.restoreToCount(count); 
} 
+0

我使用API​​等級8(2.2)是已經有像硬件加速的事情呢?我找不到'setLayerType(...)'方法,並將'android:hardwareAcceleration'標籤放入清單導致錯誤。我該怎麼辦? – Max

+0

您必須將'targetSdkVersion'更改爲更高的值(至少11) –

+0

但是我希望我的應用程序自API-8以來可用於手機。還有其他解決方案嗎?我正在使用碎片和東西的支持框架 - 任何可以幫助我的東西? :( – Max