禁用mapView的硬件加速会导致不断重绘

Fly*_*iew 6 hardware android background colors acceleration

简短版本: 使用android禁用硬件加速:xml中的hardwareAccelerated ="false"会将Theme.Sherlock.Light.DarkActionBar主题的背景颜色更改为更白的"白色". 编辑:这曾经是主要问题.我更改了标题以强调第二个问题.

仅为mapView禁用硬件加速会导致不断重绘.

长版:

API级别14及更高版本默认启用AFAIK硬件加速.(参考)

由于我正在构建和测试API级别16,因此我的硬件加速通常是开启的,这就是我以前所看到的.主题是浅色但不是很纯白色,它是浅灰色(默认).

我在地图上绘制了一些圆形叠加,当我放大时,mapview变得非常迟钝,我在logcat中得到一个"太大而无法渲染到纹理中"的形状.我发现关闭硬件加速可以解决问题.

当我为Android清单中的应用程序(或单个活动)关闭硬件加速时,布局的背景颜色会发生变化.它从浅灰色到非常浅灰色,几乎是纯白色.这是正常的行为吗?

我试着为mapview关闭硬件加速:

if(android.os.Build.VERSION.SDK_INT>=11) {
mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
Run Code Online (Sandbox Code Playgroud)

这很好地摆脱了纹理太大的错误,因为mapview不是硬件加速的,它还可以加速我的应用硬件的其余部分.这将是理想的解决方案.但是,这会导致另一个问题.它使我使用此代码的覆盖的onDraw方法不断被调用.也就是说,onDraw本身被一遍又一遍地调用,而不需要在mapview上调用invalidate().知道为什么会这样吗?

更新:

下面是一些简单的代码,当仅为mapView(我想要的)禁用硬件加速时,将使用常量重绘重新创建问题:

MapActivity:

public class SettingsActivity extends MapActivity {

private MapView mapView;
private static List<Overlay> overlayList;
private static AccuracyCircleOverlay accuracyCircleOverlay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_manage_maps);

    mapView = (MapView) findViewById(R.id.map);

    overlayList = mapView.getOverlays();
    accuracyCircleOverlay = new AccuracyCircleOverlay(this);
    overlayList.add(accuracyCircleOverlay);
}

@Override
protected boolean isRouteDisplayed() {
    return false;
}
}
Run Code Online (Sandbox Code Playgroud)

覆盖:

public class AccuracyCircleOverlay extends Overlay {

private Context context;

public AccuracyCircleOverlay(Context context) {
    this.context = context;
}

@TargetApi(11)
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    super.draw(canvas, mapView, shadow);

    if (android.os.Build.VERSION.SDK_INT >= 11) {
        mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }                 
            Log.d("accuracy OVERLAY", "being redrawn");
}
}
Run Code Online (Sandbox Code Playgroud)

Fly*_*iew 4

我终于意识到问题是什么了。将mapView 的图层类型设置为软件不应该在覆盖层的绘制方法内部完成!这样做似乎会触发另一次平局,从而导致循环。我将以下代码放入保存 mapView 的 Activity 的 onCreate 中,并且它起作用了。它告诉mapView以软件模式渲染,而不会导致不断的重绘!

活动中:

if (android.os.Build.VERSION.SDK_INT >= 11) {
    mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}  
Run Code Online (Sandbox Code Playgroud)

或者在 XML 中:

<com.google.android.maps.MapView
        ...
        android:layerType="software" />
Run Code Online (Sandbox Code Playgroud)