短版: 在 xml 中使用 android:hardwareAccelerated="false" 禁用硬件加速会将我的 Theme.Sherlock.Light.DarkActionBar 主题的背景颜色更改为更白的“白色”。 编辑:这曾经是主要问题。我更改了标题以强调第二个问题。
仅对 mapView 禁用硬件加速会导致不断重绘。
长版:
默认情况下,AFAIK 硬件加速在 API 级别 14 及更高级别上启用。(参考)
由于我正在构建和测试 API 级别 16,因此我的硬件加速通常是开启的,所以这就是我习惯看到的。主题是浅色但不是纯白色,它是浅灰色(默认)。
我在地图上绘制了一些圆形叠加层,当我放大关闭时,地图视图变得非常滞后,并且在 logcat 中出现“太大而无法渲染为纹理”的形状错误。我发现关闭硬件加速可以解决问题。
当我在 android 清单中为应用程序(或单个活动)关闭硬件加速时,我的布局的背景颜色会发生变化。它从浅灰色变为非常浅的灰色,几乎是纯白色。这是正常行为吗?
我尝试为地图视图关闭硬件加速:
if(android.os.Build.VERSION.SDK_INT>=11) {
mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
这对于消除纹理过大的错误非常有效,因为地图视图没有硬件加速,并且它还使我的应用程序的其余部分硬件加速。这将是理想的解决方案。然而,这会导致另一个问题。它使我使用此代码的叠加层的 onDraw 方法不断被调用。即,onDraw 本身被一遍又一遍地调用,而不在 mapview 上调用 invalidate()。知道为什么会这样吗?
更新:
下面是一些简单的代码,当仅为mapView(我想要的)禁用硬件加速时,将重新创建常量重绘问题:
地图活动:
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;
}
}
覆盖:
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");
}
}