1

二次元のスクロール可能な正方形タイルのマトリックスを表示する単純なアプリを構築しようとしています。リングのように 1 行または 1 列をスクロールできる 2D ルービック キューブを想像してみてください。

コンポーネントのカスタム実装によって、メイン ビュー内に を配置RelativeLayoutし、その中にマトリックスのすべてのタイルを配置しました。ImageView値を操作して、単一のタイルの正確な位置を設定しRelativeLayout.LayoutParamsます。

RelativeLayout rl = ...;
TileView tile = ...;
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(size, size);
rlp.setMargins(left, top, 0, 0);
rl.addView(tile, rlp);

マージンの代わりにタイルの上部と左側のパラメーターを変更したいので、このアプローチは本当に好きではありませんが、それは私ができる最高のものです。

ドラッグ イベントの方向に応じて、相対的な行または列のドラッグを処理するために、各タイルにリスナーをアタッチしました。いくつかの問題を除いて、すべてが非常にうまく機能しているようです。

  1. 行を右にスクロールすると、右マージンの最後のタイルが残りのスペースを埋めようとしているかのように徐々に縮小し、最終的には消えます。
  2. 次に左にスクロールすると、消えたタイルは再び表示されません。

さらに、ユーザーに無限の行/列の錯覚を与える最良の方法は何かを理解する必要があります。おそらくその行/列がスクロールされている場合にのみ、各行/列の両側にあるすべてのタイルを複製する必要があると思います。

コードをいじっていると思うので、このインターフェイスを実現するための最良の方法は何かを理解するためだけに助けを求めています。さらに詳細が必要な場合は、私に尋ねてください。

ありがとうございました!

4

1 に答える 1

1

もし私がこれをしているとしたら、あなたよりも低いレベルでそれを行う傾向があります. SurfaceViewをメイン ビューとして使用し、Canvas.drawBitmap()でタイルをレンダリングします。より多くの作業のように聞こえるかもしれませんが、それはあなたがやろうとしていることを行うための正しい方法であり、最終的には結果に満足できると思います.

2 つの問題に対処するには:

  1. リンク先の I のバージョンではdrawBitmap()、描画するビットマップのサブセットを指定できるため、タイルが画面からはみ出すときに縮小するのではなく、タイルを切り取ることができます。
  2. 何がどこにあるのか (そしてそこに描画するのか) を決定する責任があるため、タイル マトリックスを表すデータ構造は、オフスクリーン タイルも表す必要があります。
于 2012-05-31T19:44:31.513 に答える