13

(たとえば)640 * 480ピクセルのオフスクリーンビットマップを作成し、それをSurfaceViewに表示するAndroidアプリケーションを作成しています。画像のサイズは、実際の端末の表示よりも大きくなっています。

アプリケーションの動作方法は、最初に画像の左上隅 (0,0) を表示してから、画像をスクロールできるようにしたいと考えています。

私の Surfaceview クラスは onMeasure コールバックを実装し、電話スクリーンに対応する画像の領域を表示する 1024*768 のサイズを返します。ドキュメントが非常に限られているため(クラスの束と一貫性のない呼び出しのみ)、スクロールのサポートを実装したいと思いますが、これはほぼ不可能です。scrollBy を呼び出してみましたが、うまくいきません。

続行する方法について誰かが何か指針を持っている場合、これは大歓迎です。

4

2 に答える 2

8

SurfaceView の使用を開始すると、ピクセルの空白領域がある世界に自分自身が移動し、自分でそれらを好きなように描画できるようになります。すべてを自分で行います。つまり、スクロールも自分で実装する必要があります。取るに足らないことではありませんが、難しすぎることもありません。

これを行う 1 つの方法は次のとおりです。 - SurfaceView を拡張し、SurfaceHolder.Callback を実装します - getHolder().addCallback( this ) を使用してコールバックを取得します - OnTouch イベントを使用してスクロール動作を実装します (つまり、応答時に x を取得します) ,MotionEvent からの位置とオフセットを適切に設定します)。

イメージの更新を処理するスレッドを実装します。この例はウェブ上にあります (申し訳ありませんが、今は手元にありません)。

または、オフスクリーン ビットマップを使用して、通常の ImageView で描画します (ImageView のサイズをビットマップのサイズに合わせてスクロール ビューに配置します)。


編集:

これはまだビューを取得していることを見て、この時点から、上記の機能のフレームワークを実装する小さなライブラリをオープンソースとして実装およびリリースしたことを指摘する価値があるかもしれません (SO に関する多くのコメントに触発され、その他)。Github で見つけることができます: https://github.com/micabyte/android_game

于 2010-02-07T12:51:35.217 に答える
3

私は自分のゲームでこれを解決しました。私のsurfaceViewは、 GoogleによるLunarLanderの例を適応させたものです。

doDraw メソッドで独自のプライベート キャンバスを使用して独自のプライベート ビットマップに描画し、その一部を以下のコードを使用して与えられたキャンバスにコピーすることを除いて、すべて同じです。

Rect src = new Rect(mScrollX, mScrollY, mScrollX+mSurfaceWidth, mScrollY+mSurfaceHeight);
Rect dst = new Rect(0, 0, mSurfaceWidth, mSurfaceHeight);
surfaceCanvas.drawBitmap (mLevelBitmap, src, dst, null);

Rect オブジェクトは、drawBitmap がソース Bitmap (私のプライベート ビットマップ) から宛先 (doDraw() で描画するように指定された Canvas) にピクセルをスケーリング/変換する方法を定義します。

mScrollX と Y は、表示される四角形の左上隅です (大きなプライベート ビットマップに対して)。

mSurfaceWidth/Height は、表示される長方形のサイズです

スクロール値が許容範囲内であることを確認してください [0,privateBitmapWidth-mSurfaceWidth]

スクロール値を自分で更新してください(たとえば、 onTouchEvent() で)

于 2010-02-10T03:56:44.640 に答える