2

私は Android を初めて使用しますが、Java の知識があり、Android のドキュメントと本を読み始めましたが、まだ初心者です。しかし、もっと読んだとしても、Android プログラミングの実際の経験がなければ、自分がやりたいことを行うための推奨される方法を知るのは難しいでしょう...

私が必要とするのは、ペイント/描画/多くの画像、おそらく透過性のある PNG が可能な何らかの表面を持つことです。これらすべての画像で、このサーフェスをパンしたりズームしたりできる必要があります。また、これらの画像のいずれかをクリックして、どの画像がクリックされたかを知る必要もあります。

Sony Ericsson の開発者によるOne Finger Zoom Tutorialを読んでいますが、これは私がやりたいことに対する良い解決策のようです。しかし、そのコードは単一のビットマップ画像用であり、いくつかの表面/キャンバスに多数の画像を描画する必要があるため、少し混乱しています。

これを達成するために、次の 2 つの方法を考えています。

  1. Canvas(from )に各画像を描画できるように何らかの方法でコードを調整しますonDraw()が、ここで混乱します。現在のコードは単一の画像に対して単純であるため、これを達成する方法がわかりません。説明することはあまりありません。 .
  2. すべての画像を 1 つのビットマップにオーバーレイし、そのビットマップを の背景として使用しますCanvas(もう一度、 からonDraw())。これらの画像の位置を配列などに保存し、Canvasそれを参照として使用して、ユーザーがそれらのいずれかをクリックしたかどうかを確認できます。私はこれがこの方法で可能だと思いますか?

だから、実際には、ここに私が求めているものがあります:

  • 上記の最初に説明した方法の方が優れている場合は、どうすればそのようなことを達成できるかを理解してください。
  • 2 番目の方が優れている場合は、これらすべての画像をオーバーレイし、位置を保存し、タッチ イベントで検出する方法を教えてください。
  • これらすべてを処理するためのより良い方法があれば、それについて聞きたいです。

これは、私が開発を考えている非常に基本的なゲームのためのものです。その前に、OpenGL は私が必要とするものには多すぎるので、一度に 1 つずつ進めたいと思います。最初に Android プログラミングを学び、いつか OpenGL を学びます。

4

4 に答える 4

2

MapView で使用される ItemizedOverlay を使用 (または拡張) できるかどうかを確認してください。ItemizedOverlay を使用すると、通常はすべて異なる PNG ドローアブルである「マーカー」を追加できます。それらはタッチ イベントまたはジェスチャに応答し、画面の位置 (MapProjection を介してマップ座標に変換される) に従って配置されます。(私が取り組んでいるマッピングアプリでそれらを使用しています)。レイアウトには MapView を必要とする独自の draw() メソッドがありますが、これを null にしたり、マップ レイヤーの表示を無効にしたり、他の種類の背景を表示したりできる場合があります。ここではいくつかの実験が必要です。

于 2010-12-24T01:03:34.300 に答える
1

これをまっすぐにしましょう。それぞれがタッチ可能な複数の画像が必要ですか?もしそうなら、多分あなたはもう少し抽象的に考える必要があります。

ビューオブジェクトにはすでにonTouchListenersが組み込まれているため、各画像をビューオブジェクト(単なるアイデア)として扱う方が簡単かもしれません。

于 2010-12-15T01:36:38.083 に答える
1

この質問は少し古いですが、私には1つの解決策とまだ1つの質問があります:-)

複数の画像をドロップするために、このクラス (ColorBall) を使用して ArrayList を作成します。

private Bitmap img; // the image of the ball
private int coordX = 0; // the x coordinate at the canvas
private int coordY = 0; // the y coordinate at the canvas
private int id; // gives every ball his own id, for now not necessary
private static int count = 1;
private boolean goRight = true;
private boolean goDown = true;
private int height = 50;
private int width = 50; 
private Rect mRectSrc = new Rect();
private Rect mRectDst = new Rect();

ビューでクリックすると、画像の範囲内をクリックした場合、coordX と coordY を変更します (. で簡単に確認できif (x > ball.getX() && x < ball.getX()+ball.getWidth() && y > ball.getY() && y < ball.getY()+ball.getHeight())ます)。

OnDraw イベントでは、配列内のすべての要素を調べて、対応する場所に描画します。

for (ColorBall ball : colorballs) {
    canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
}

しかし、私はまだズームにこだわっています。次の投稿 (http://stackoverflow.com/questions/6422759/zoom-a-bitmap-with-drawbitmap-and-rectangles-android) のように解決しようとしていますが、まだブロックされています:-(

乾杯

于 2011-06-21T09:18:56.393 に答える
1

私の意見では、最初の解決策(以下に挿入)が最適です。

(onDraw() から) Canvas に各画像を描画できるようにコードを調整しますが、ここで混乱します。現在のコードは単一の画像に対して単純であるため、これを達成する方法がわかりません。説明することがたくさんあります。

ユースケースに応じて、ビューに画像を適切な構造、ArrayList (多くのランダムな挿入/削除を行っていない場合) で含めるようにします。onDraw() メソッドでは、このビットマップのリストを繰り返し処理し、それぞれを描画します。

それらをタッチ可能にするには、 setOnTouchListener メソッドを使用して (または View をサブクラス化する場合は onTouch() をオーバーライドします。提供されたリンクを読んでいませんでした)、ビューが呼び出されるたびに呼び出されるハンドラーを提供します。ハンドラーには、すべてのタッチ イベントの場所が与えられます。これを使用して、タッチされた画像がある場合はどの画像かを判断できます。もちろん、衝突をテストする方法は、ゲームの仕様によって異なります。

この方法は最もクリーンではありませんが、最も単純です (方法によっては最速です!)。個人的には、OpenGL は威圧的ですが、学習曲線を克服することは、将来 (vim や emacs のように!) に大きな利益をもたらすでしょう。この種のユースケースのために作成されました。

タッチ イベントの処理の詳細については、このリンクを参照してください。http://developer.android.com/guide/topics/ui/ui-events.html

于 2010-12-30T01:10:03.867 に答える