1

コード内で生成されたビットマップの配列 (アセット、カード、Web などから取得されたものではない) があり、その配列に必要なビットマップは約 50 (この数は定数ではありません) あります。最初に、すべてのビットマップを一度に作成しようとしましたが、明らかに outOfMemmory エラーが発生しました。画像は id に基づいて次々と正確な順序で並べられることが必須であるため、1 つのビットマップが作成されたときに増加する変数 bitmapID を作成し、その bitmapID 変数に基づいて画面に表示する必要がある場合にのみ画像を作成したままにしました。

したがって、最初の解決策(機能した)は、ScrollView内にあるLinearLayoutをImageViewで埋めることでした。アクティビティ onCreate() 内でメソッド fillScreen(int how_many_times) を呼び出します。これにより、変数 how_many_times が意図した回数だけ画像が画面に表示されます。私のデモ アプリでは、タブレットの画面を 3 回塗りつぶしました。fillScreen(int how_many_times) は、指定された ID に基づいて単一のビットマップを作成する役割を持つ loadBitmap(int bitmapID) を呼び出すループで動作しています。作成されたビットマップは、imageHolder オブジェクトの配列に保存されました。bitmap と id 以外の imageHolder オブジェクトにも、スクロール位置を示す scroll_start と scroll_end パラメーターがありました。たとえば、最初の imageHolder は scroll_start = 0 および scroll_end = 500 になり、2 番目の imageHolder は scroll_start = 500 および scroll_end = 800 になります。アクティビティには onScrollChanged(scrollView, int x, int y, int oldx, int oldy) の実装があり、スクロールに反応して画面の下部に画像を追加し、上部から削除します。したがって、実装は次のように機能しました。

if (y > arrayOfImageHolders.get(1).getScroll_end() && removeEnabled) 
{
//removes one image view from beginning of LinearLayout
removeFromBegining();
scrollView.scrollTo(0, arrayOfImageHolders.get(1).getScroll_start());
}

if (y > arrayOfImageHolders.get(arrayOfImageHolders.size() - 1).getScroll_start() && fillEnabled) 
{

//Adds image views at the end of LinearLayout                   
fillScreenEnd(1);

}

この実装では、スクロールはスムーズで、画像が追加または削除されたときにスクロールでジャンプすることはほとんどありませんでした。すべての imageHolder オブジェクトで画像を追加または削除した後、scroll_start および scroll_end の値が常に更新されていました。したがって、この実装は前方スクロールで機能しましたが、後方スクロールでも同じように機能する必要がありました。そのため、後方スクロールに反応するケースを追加し、頭の中で前方スクロールと同じように完全に機能する必要がありました。ケースの後方スクロール:

if (y > arrayOfImageHolders.get(arrayOfImageHolders.size() - 1).getScroll_start() && fillEnabled) 
{

//Adds image views at the end of LinearLayout                   
fillScreenEnd(1);

}
else if(y < arrayOfImageHolders.get(1).getScroll_start()) && fillEnabled && y < oldy)
{
//Add image views at the beginning of LinearLayout
fillScreenStart(1);

}

if (y > arrayOfImageHolders.get(1).getScroll_end() && removeEnabled) 
{
//removes one image view from beginning of LinearLayout
removeFromBegining();
scrollView.scrollTo(0, arrayOfImageHolders.get(1).getScroll_start());
}
else if(y < arrayOfImageHolders.get(arrayOfImageHolders.size()-2).getScroll_start() && removeEnabled && y < oldy)
{
//removes one image view from end of LinearLayout
removeFromEnd();

}

scrollTo() を別の場所に含めてみましたが、どこでも機能しません。何かが最初に追加されたり、最後から削除されたりすると、スクロールは動き続けます。scrollView が大きくなっても小さくなっても、スクロール位置を一定に保ちたい。それを実現する方法についてのアイデアはありますか?または、この種の scrollView を実装する方法に関する他のアイデアはありますか?

また、カスタム アダプターと onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) の実装で ListView を試し、アイテムの削除と追加、notifyDataSetChange() の呼び出しで arrayOfImageHolders を変更しようとしましたが、画面の位置を安定させることができませんでした。どちらかを削除または追加する場合。

このケースと問題をより明確にするために、カジノのスロット マシンを想像してみてください。常に順番に残っている画像のリストがありますが、画面に表示されるのは 1 つだけです。また、ホイールを両方向に回転させることができ、ホイールに画像を追加したり削除したりしても、画面に表示される画像は同じままです。

私にとっては複雑な問題のように見えるので、具体的な解決策だけでなく、どんなアイデアでも歓迎します。

4

0 に答える 0