1

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

ビューのチャンクを線形レイアウトにプログラムで追加 (および削除) する必要がありますか? この種のロング スクロール カスタム コントロールの描画に関して、どのような経験があるかを聞くことができれば幸いです。

ありがとう/エリック

4

4 に答える 4

1

パーティーに少し遅れましたが、もっと簡単な方法を紹介すると思いました。背景の画面サイズまたはビューのサイズが必要なだけで、次のコードを呼び出します(拡張していると仮定します。 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);

    }



}
于 2012-02-04T19:47:38.570 に答える
1

リスト/グリッドまたは Adapter for data を使用するものを使用している場合は、CommonsWare によって作成され、ここで入手できる最も優れたクラスを使用できます。

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

それは特にこの目的のためでした

于 2009-10-18T10:55:20.180 に答える
1

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

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

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

これを実装するのはやや難しいですが (そのため、最初に単純なアプローチを提案しました)、絵が描かれた紙を想像してみてください。左側を包み込み、右側に接着します (チューブが得られます)。このようにして、紙を無期限にスクロールできます (チューブを y 軸を中心に回転させることにより)。

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

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

  • 分割の右側 (ピクセル 10 にある) をコントロールのピクセル 0 にコピーします。(したがって、(10, 0) - (幅 - 高さ) から (0,0) までの領域全体
  • 次に、分割の左側をコピーします。ピクセル 0 から 10 をピクセル幅 10 にコピーします。そう: (0,0)-(10,高さ) から (幅-10, 0)

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

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

すべての方向への ps スクロールは、まったく同じ方法で実現できます (ただし、正しく行うのはさらに困難です) ;^)

于 2009-10-17T15:01:08.743 に答える
0

XMLではどうですか?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);

}
于 2016-09-14T01:34:54.273 に答える