Android 4.0以降でテキストの表示がとても遅くなる件
Android 4.0でハードウェアアクセラレーションが有効な状態で、たくさんの文字種を表示するとパフォーマンスが激しく悪くなる件。
テスト用のAPK。Android 4.0以降用で試してください。(4.0未満だと意味がありません)
0〜100行目までは滑らかにスクロールします。
100〜200行目まではスクロールがものすごく遅くなります。(Nexus 7で10fps以下)
再現するためのコードはこんな感じです。
AndroidManifest.xml。
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="16" />
Activityのコード。
0〜100行目は各行1種類の文字だけを表示。
100〜200行目は1行に50種類の文字を表示しています。
public class ListViewTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView listView = new ListView(this); setContentView(listView); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); char x = 0x4E9C; // 100行目までは1行に1種類の文字を100文字表示 for (int j=0; j<100; j++) { String s = ""; for (int k=0; k<100; k++) { s += Character.toString(x); } adapter.add(s); x++; } // 100行目以降は1行に50種類の文字を50文字表示 for (int j=0; j<100; j++) { String s = ""; for (int k=0; k<50; k++) { s += Character.toString(x); x++; } adapter.add(s); } listView.setAdapter(adapter); } }
ハードウェアアクセラレーションを無効にすると、30fps程度はでます。
<activity android:name=".ListViewTestActivity" android:hardwareAccelerated="false" android:label="@string/app_name" >
誰か回避方法を知っていたら教えてください。
これは極端なサンプルですが、日本語表示してるとこれに近い状況がよく発生してパフォーマンスが悪くなったりするんですよね。
たぶん英語みたいに文字が少ない環境だと、ぜんぜん問題ないんだと思いますが。