短いバージョン: xmlでandroid:hardwareAccelerated = "false"を使用してハードウェアアクセラレーションを無効にすると、Theme.Sherlock.Light.DarkActionBarテーマの背景色がより白い「白」に変わります。 編集:これは主な質問でした。2番目の問題を強調するためにタイトルを変更しました。
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は、マップビューで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");
}
}