1

私の状況では、境界を設定するために、背景の領域内に他のオブジェクトが含まれている背景を描画します。ビットマップを正しい位置にレイアウトするようにサーフェスビューの描画を設定しましたが、別のデバイスでテストするとすぐに、物事が正しい位置にありませんでした。

コードをリファクタリングして具体性を下げ、すべての計算をキャンバスの中心から外しました(これは特定の画像の要件です)。他のオブジェクトを画像の特定の領域に保持する必要があることを考えると、mdpi画像のxy位置を把握し、キャンバスのスケールに基づいて位置をスケーリングすることを試みることができると思いました。動作しませんでした。この時点で他に何を試すべきかよくわかりません。

//Center of canvas
float centerX = canvas.getWidth() / 2;
float centerY = canvas.getHeight() / 2;

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mBackground.getWidth() / 2), -(mBackground.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX, centerY);
canvas.drawBitmap(mBackground, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mFlatBobble.getWidth() / 2), -(mFlatBobble.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX-(10 * mScale), centerY + (50 * mScale));
canvas.drawBitmap(mFlatBobble, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mBobble.getWidth() / 2), -(mBobble.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX + (68 * mScale), centerY + (78 * mScale));
canvas.drawBitmap(mBobble, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mMask.getWidth() / 2), -(mMask.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX, centerY);
canvas.drawBitmap(mMask, mDrawingMatrix, null);

EDIT2:以下のコードは廃止されました。以下に追加した回答をご覧ください。

編集:作業コードは次のようになります:

//In the constructor...
DisplayMetrics dm = new DisplayMetrics();
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
mTargetScreenXRatio = (float)(dm.widthPixels / 480);
mTargetScreenYRatio = (float)(dm.heightPixels / 320);

//Center of canvas
float centerX = canvas.getWidth() / 2;
float centerY = canvas.getHeight() / 2;

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mBackground.getWidth() / 2), -(mBackground.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX, centerY);
canvas.drawBitmap(mBackground, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mFlatBobble.getWidth() / 2), -(mFlatBobble.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX-(10 * mScale * mTargetScreenXRatio), centerY + (50 * mScale * mTargetScreenYRatio));
canvas.drawBitmap(mFlatBobble, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mBobble.getWidth() / 2), -(mBobble.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX + (68 * mScale * mTargetScreenXRatio), centerY + (78 * mScale * mTargetScreenYRatio));
canvas.drawBitmap(mBobble, mDrawingMatrix, null);

mDrawingMatrix.reset();
mDrawingMatrix.postTranslate(-(mMask.getWidth() / 2), -(mMask.getHeight() / 2));
mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(centerX, centerY);
canvas.drawBitmap(mMask, mDrawingMatrix, null);
4

2 に答える 2

3

あなたの問題が私が通常持っているものと同じであるならば、私は現在の画面解像度に基づいて比率を自分で計算することによってそれを解決しました。

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

screenW = dm.widthPixels;
screenH = dm.heightPixels;

X = (float) screenW / 480;
Y = (float) screenH / 800;

480 * 800は私の参照画面サイズです。参照画面サイズとして、お好みに変更できます。

この時点で、正しい比率を得るには、座標にXとYを掛けるだけです。

于 2013-03-04T22:31:20.067 に答える
0

受け入れられた答えを変更するつもりはありませんが、実際には少し違ったやり方でこれを行いました。などをチェックして解像度の変化を手作業で計算する代わりにdm.widthPixels、私はそれを行うためのはるかに良い方法を見つけました。

代わりのコードは次のようになります。

//Trimmed for brevity.
//In the constructor...
//mDisplayMetrics is a private variable in the class.
this.mDisplayMetrics = new DisplayMetrics();
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
//I no longer need the target ratio variables anymore.

float bobblePosX = centerX - (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, this.mDisplayMetrics) * mScale);
float bobblePosY = centerY + (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, this.mDisplayMetrics) * mScale);

mDrawingMatrix.postScale(mScale, mScale);
mDrawingMatrix.postTranslate(bobblePosX, bobblePosY);
canvas.drawBitmap(mFlatBobble, mDrawingMatrix, null);

上記のコードでは、以前に持っていたターゲット画面の比率の値に、必要なmdpi値の位置を掛けることから変更しました。また、画像が常に画面の解像度と一致するとは限らないため、位置をわずかに拡大縮小する必要があります。

これが誰かを助けることを願っています!

于 2013-03-17T00:44:46.793 に答える