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)
我终于意识到问题是什么了。将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)
| 归档时间: |
|
| 查看次数: |
3660 次 |
| 最近记录: |