0

私は 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 に等しくない場合のみ) を方程式とマージするにはどうすればよいですか?

または、マトリックスを変更した後、キャンバス上のオーバーレイ オブジェクトの新しい座標を見つける別の方法はありますか?

この問題を解決するのを手伝ってください。私は助けに感謝します。ありがとうございました。

4

1 に答える 1

1

matrix.mapPoints() を使用してみてください

u は画像の絶対座標を持っている必要があります

絶対コーディネートするには?

void calculaCoordenadasImagen(MotionEvent e){
    float []m = new float[9];
    matrix.getValues(m);
    float transX = m[Matrix.MTRANS_X] * -1;
    float transY = m[Matrix.MTRANS_Y] * -1;
    float scaleX = m[Matrix.MSCALE_X];
    float scaleY = m[Matrix.MSCALE_Y];
    lastTouchX = (int) ((e.getX() + transX) / scaleX);
    lastTouchY = (int) ((e.getY() + transY) / scaleY);
    lastTouchX = Math.abs(lastTouchX);
    lastTouchY = Math.abs(lastTouchY);
}

次に、2つの異なる配列を使用してポイントを保存します

int [] absolute = new int[2];
absolute[0]=lastTouchX;
absolute[1]=lastTouchY;

int [] points = new int[2];
points = matrix.mapPoints(absolute)

絶対座標には絶対座標があり、ポイントには知りたいポイントがあります

助けてほしい!

于 2014-11-11T08:34:32.683 に答える