【发布时间】:2012-11-08 04:38:14
【问题描述】:
短版: 在 xml 中使用 android:hardwareAccelerated="false" 禁用硬件加速会将我的 Theme.Sherlock.Light.DarkActionBar 主题的背景颜色更改为更白的“白色”。 编辑:这曾经是主要问题。为了强调第二个问题,我改了标题。
仅对 mapView 禁用硬件加速,会导致不断重绘。
加长版:
默认情况下,AFAIK 硬件加速在 API 级别 14 及更高级别启用。 (reference)
由于我正在为 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");
}
}
【问题讨论】:
-
也遇到这个,以为只有我一个..
-
貌似是安卓的bug,应该提交。
-
硬件加速和你的 MapView 覆盖调用没有关系,你能发布你的 MapView 及其覆盖的源代码吗?
-
是的,Anis,这是预期的,但不是正在发生的。更新了简化代码以显示在 mapView 上禁用硬件加速时的重绘问题。
标签: android colors background hardware acceleration