简短版本 使用android禁用硬件加速:xml中的hardwareAccelerated =“false”会将Theme.Sherlock.Light.DarkActionBar主题的背景颜色更改为更白的“白色”。 编辑:这曾经是主要问题。我更改了标题以强调第二个问题。
仅禁用mapView的硬件加速,会导致不断重绘。
长版:
默认情况下,API级别14及更高版本启用AFAIK硬件加速。 (reference)
由于我正在构建和测试API级别16,我的硬件加速通常是开启的,这就是我以前看到的。主题是浅色但不是非常纯白色,它是浅灰色(默认)。
我在地图上绘制了一些圆形叠加层,当我在近距离放大时,mapview变得非常迟钝,我在logcat中得到的形状“太大而无法渲染为纹理”错误。我发现关闭硬件加速可以解决问题。
当我为Android清单中的应用程序(或单个活动)关闭硬件加速时,布局的背景颜色会发生变化。它从浅灰色到非常浅灰色,几乎是纯白色。这是正常行为吗?
我尝试使用以下方式为mapview关闭硬件加速:
if(android.os.Build.VERSION.SDK_INT>=11) {
mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
这非常适合摆脱纹理太大的错误,因为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;
}
}
重叠:
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");
}
}
答案 0 :(得分:4)
我终于意识到问题所在。 不应该从叠加层的draw方法内部设置mapView的图层类型到软件!这样做似乎会触发另一个绘图,从而导致循环。我将以下代码放在我的Activity的onCreate中,它包含了mapView并且它工作正常。它告诉mapView以软件模式渲染而不会导致不断重绘!
活动:
if (android.os.Build.VERSION.SDK_INT >= 11) {
mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
或者在XML中:
<com.google.android.maps.MapView
...
android:layerType="software" />
答案 1 :(得分:2)
我很欣赏这个答案没有解决你的问题的重点(我理解为在质疑为什么MapView
和相关的叠加在硬件加速关闭时不断重绘 - 我承认,我真的不知道为什么)。但是,我认为你应该开启加速度,而是专注于限制你在叠加层中实际绘制的大小,正如ndw建议的那样。
这正是我现在正在处理的应用程序中必须做的事情。我在Path
的顶部绘制MapView
来说明GPS数据日志中的路线。如果我放大太远,Path
突然消失,我在LOGCAT中收到一条警告,说“形状路径太大而不能渲染成纹理”,就像你一样。我解决它的方法是在地图的每个缩放上重新生成Path
(考虑到它,无论如何都需要这样做,因为在每个缩放级别,你从Projection
得到的实际像素位置显然是不同的)。当Path
由您所基于的任何数据生成时(例如GeoPoint
s的集合),使用Projection
类来确定是否有任何路径段等方式离开地图,应该离开(这是我用我的GPS路线做的)。如果您有单个矢量对象本身可能会变得太大(例如圆圈),那么我建议您设计代码,以便它包含圆圈,如果它的任何区域落在地图内,还包括一些逻辑如果处于高缩放级别,只需在可见区域绘制该圆形表面的一小部分(例如通过绘制正方形)。
答案 2 :(得分:1)
我认为改变颜色不是特定于你的代码,我经历过同样的事情。
运行没有GPU仿真和holo_light主题的模拟器,你得到一个白色背景,使用GPU模拟运行,你得到浅灰色背景。
那就是说,我不认为禁用硬件加速是解决mapview问题的正确方法。我会试着找出你试图渲染的形状太大的原因,以及你可以做些什么来缩小它。