私は Android プロジェクトに取り組んでおり、View クラスを使用して画像とオーバーレイを描画しています。このコードを使用して画像と円を描画しています(正常に動作しています):
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if (!isInitialized) {
w = getWidth();
h = getHeight();
position.set(w / 2, h / 2);
// Scaling image to be fit screen
if(width<=height) { scale=((float)w)/width; } else { scale=((float)h)/height; }
isInitialized = true;
}
Paint paint = new Paint();
matrix.reset();
matrix.postTranslate(-width / 2.0f, -height / 2.0f);
matrix.postRotate((float)(angle*180/Math.PI));
matrix.postScale(scale, scale);
matrix.postTranslate(position.getX(), position.getY());
canvas.drawBitmap(bitmap, matrix, paint);
canvas.concat(matrix);
canvas.drawCircle(testPoint.x, testPoint.y, 20, paint );
}
ここで、PopupWindow ウィンドウを画像上のヒントとして、円の同じ位置 (testPoint) に表示したいと考えています。ただし、PopupWindows は描画可能なオブジェクトではないため、PopupWindow の座標を同じにするために、スケーリング、回転、および変換後に testPoint の新しい座標を見つけるにはどうすればよいですか。
私はコードを書き込もうとしていますが、正常に動作しますが、回転とスケーリングなしでのみ変換するために、これは私が書いたコードです:
int offsetX=(int) (-(width / 2.0f)+position.getX())+rc.left;
int offsetY=(int) (-(height / 2.0f)+position.getY())+rc.top;
Point RotatedPoint = RotatePoint(testPoint, centerPoint, angle);
RotatedPoint.x +=offsetX;
RotatedPoint.y +=offsetY;
popup.update(RotatedPoint.x, RotatedPoint.y, -1, -1);
rc は、ビットマップ ビュー座標とスクリーン座標のオフセットの差です。
RotatePoint 関数をテストしたところ、正しく動作しました。
注: スケールが 1 の場合 (スケーリングを無効にする)、画像を回転または移動すると、ポップアップ ウィンドウの位置が正しく更新されます。
スケール (1 に等しくない場合のみ) を方程式とマージするにはどうすればよいですか?
または、マトリックスを変更した後、キャンバス上のオーバーレイ オブジェクトの新しい座標を見つける別の方法はありますか?
この問題を解決するのを手伝ってください。私は助けに感謝します。ありがとうございました。