2

私はいくつかの地理クイズゲームに取り組んでいます。

ユーザーは、マップ上で定義されたものを見つける必要があります。

画像のサイズに対する X と Y の位置を計算するマップ ポイント ジェネレーターを作成しました。したがって、地図上の場所の X と Y は次のように表されます。 float * imageWidth = X float * imageHeight = Y;

ユーザーが画像ビューにタッチすると、正しい位置があったマップに描画する必要があります。

画像ビューのスケール タイプが "FitXY" として定義されている場合、コードはそれらの相対座標と画像の境界のサイズを使用して位置を計算し、正常に動作しますが、マップが引き伸ばされて見栄えがよくありません。

"centerInside" 縮尺タイプを使用すると...地図画像はきれいに見えますが、正しい位置の座標が正しい場所を指していません。

これらの座標を、画面に描かれた実際の画像に対応するように変換するにはどうすればよいですか?

また、画像ビューではなくビットマップのタッチ座標が必要です...正しい場所とタッチされた場所の間の距離を計算できます。

ImageView内の画面に描画されたビットマップのキャンバスを取得するには?

これは私にとって少し混乱しています...

何か案が?

Tnx?

編集:

これまでの私のコードは次のとおりです。

Drawable drawable = stageImage.getDrawable(); Rect imageBounds = drawable.getBounds();

                // height and width of the visible (scaled) image
                int scaledHeight = imageBounds.height();
                int scaledWidth = imageBounds.width();

                Matrix inverse = new Matrix();
                stageImage.getImageMatrix().invert(inverse);

                // map touch point from ImageView to image
                float[] touchPoint = new float[] { event.getX(),
                        event.getY() };
                inverse.mapPoints(touchPoint);

                // Relative touch points
                float relativeX = touchPoint[0] / scaledWidth;
                float relativeY = touchPoint[1] / scaledHeight;

                // Prevent errors
                if (relativeX < 0) {
                    relativeX = 0;
                }

                if (relativeX > 1) {
                    relativeX = 1;
                }

                if (relativeY < 0) {
                    relativeY = 0;
                }

                if (relativeY > 1) {
                    relativeY = 1;
                }


                touchX = event.getX();
                touchY = event.getY();

     //THIS WORKS FINE!!!!!
                // Draw touched point
                stageImage.drawTouchedSpot(touchX, touchY);

                // Get correct relative position and draw it
                double correctRelativeX = gameHandler
                        .getCurrentMapElement().getxCoordinate()
                        * imageBounds.width();
                double correctRelativeY = gameHandler
                        .getCurrentMapElement().getyCoordinate()
                        * imageBounds.height();

    //THIS IS NOT RIGHT WHEN STAGE IMAGE SCALE TYPE IS "CENTER INSIDE"
                stageImage.drawFlag(correctRelativeX, correctRelativeY);
4

3 に答える 3

0

ここにあるこのマッピングは、スケーリングされた幅/高さをすでに考慮に入れているはずです

float[] touchPoint = new float[] { event.getX(), event.getY() };
inverse.mapPoints(touchPoint);

だから私はあなたがこれを必要とするとは思わない:

            // Relative touch points
            float relativeX = touchPoint[0] / scaledWidth;
            float relativeY = touchPoint[1] / scaledHeight;

また、スケール タイプを SCALE_TYPE.MATRIX に変更し、imageView を使用しgetImageMatrix()てビューを変更してみてください。

于 2013-09-23T19:03:01.627 に答える
0

ImageView.getImageMatrix() を使用するだけです。

于 2013-08-01T09:43:40.330 に答える
0

私はすべての問題の答えを見つけたと思います...

私のコードは、ここで説明されている小さな魔法でうまく機能します。

http://argillander.wordpress.com/2011/11/24/scale-image-into-imageview-then-resize-imageview-to-match-the-image/

画像のスケーリング タイプを「centerInside」に設定しましたが、scaleImage() メソッドを使用すると、ビットマップ画像に合わせて画像ビューのサイズを変更できます...

そうすれば、相対座標が正しくなり、正しい位置にアニメーションを描画できます! とにかくTnx!

より良いアイデアがあれば...試してうれしいです...これは最も最適化されたアプローチではないと思います

于 2013-08-01T16:37:58.637 に答える