Android で「無限に」ワイドビューをスクロールするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1582326

質問

Android で「無限」のスケールのようなコントロールをスクロールする方法について、代替案を考えています。単純なアイデアは、スクロールの動きごとにビュー全体を再描画することですが、どういうわけかそれは適切な方法ではないようです。コンテンツを事前に描画することは可能ですが、そもそもビューをどのくらいの幅にすればよいのかわかりません。また、ユーザーがビューの最後までスクロールするとどうなるでしょうか?そういう方向に視野を広げていく必要があると思います。

プログラム的にビューのチャンクを線形レイアウトに追加 (および削除) する方向に進むべきでしょうか?この種の長いスクロールのカスタム コントロールの描画に関して、どのような経験があるのか​​を聞いていただければ幸いです。

ありがとう /エリック

役に立ちましたか?

解決

は、リスト/グリッドまたはデータ用アダプタを使用するもので作業している場合、あなたはここでCommonsWareと利用可能で書かれた最も優れたクラスを使用することができます:

http://github.com/commonsguy/cwac-endlessする

それは特にこの目的のためだった。

他のヒント

コントロールのサイズのオフスクリーン バッファーを使用します。

最初は簡単な方法でやってください。正しい位置にスクロールされたオフスクリーンバッファ全体を描画します。準備ができたら、実際の画面にブリットします。

これが遅すぎる場合は、オフスクリーンバッファ全体を再描画するのではなく、垂直方向に分割して最適化を試みます。(概念を理解しやすくするために、ここでは水平スクロールの動きについてのみ説明します。ただし、この方法は 8 方向スクロールにも適用されます)

これを実装するのはやや難しいですが (そのため、最初に簡単な方法を提案しました)、絵が描かれた紙の左側を巻き付けて右側に貼り付ける (つまり、チューブが得られる) と想像してみてください。このようにして、(Y 軸を中心にチューブを回転させることにより) 紙を無限にスクロールできます。

同様に、オフスクリーン バッファーでも同じことを行うことができます。オフスクリーン バッファーに完全なコンテンツを描画して、オフスクリーン バッファーを準備します。

ここで右にスクロールすると、基本的にオフスクリーン バッファーを 2 つに分割します (この垂直分割によって (接着剤があった例の紙のように))。右に 10 ピクセルスクロールすると、次のようになります。

  • 分割の右側 (ピクセル 10 に位置) をコントロールのピクセル 0 にコピーします。(つまり、(10, 0) - (幅 - 高さ) から次の領域全体:(0,0)
  • 次に、分割の左側をコピーします。ピクセル 0 ~ 10 からピクセル幅 -10。それで:(0,0)-(10,高さ)から(幅-10,0)

これを行う前に、変更されるピクセル (この場合は 10 ピクセルをスクロールしたので 10 ピクセル) のみを再描画します。他のすべてのピクセルは依然として同一であるため、再描画する必要はありません。

本当に理解するには、これを自分で紙に書いてみる必要があります。これは、リソースが限られているプラ​​ットフォーム (携帯電話など) でのゲーム開発では非常に一般的な手法です。

追記全方向のスクロールもまったく同じ方法で実現できます (ただし、正しく理解するのはさらに困難です) ;^)

少し遅れてパーティーに、私は、私はあなたに行くには非常に簡単な方法を示したい考え出し: あなたは自分の背景がある中で、ビューの画面サイズや大きさが必要で、次のコード(ビューを拡張していると仮定してonDrawをオーバーライド)を呼び出します:

 private void drawEndlessBackground(Canvas canvas, float left, float top) {

    float modLeft = left % screenWidth;

    canvas.drawBitmap(backgroundImage, modLeft, top, null);

    if (left < 0) {

        canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

    } else {

        canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

    }



}

どのようにXMLでは? プライベートボイドdrawEndlessBackground(キャンバスキャンバス、フロートは、フロートの上面を左側){

float modLeft = left % screenWidth;

canvas.drawBitmap(backgroundImage, modLeft, top, null);

if (left < 0) {

    canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

} else {

    canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top