14

Android ではsetPivotX(これも) 奇妙な動作をすることがわかりました。setPivotYビューのスケールが 1.00f に設定されているときにピボットを設定すると、何も起こりません (ピボットの変更のみ)。しかし、スケールが 1.0f と等しくなく (例setScaleX(0.9f))、ピボットを設定すると、ビューは新しいピボットに対して相対的に (?) 移動します。変じゃない?水平および垂直位置 (平行移動) がピボット値に関連していないことはわかっていますが、ビューが 1.0f 以外の倍率で移動するのはなぜですか?

スケーリング部分の有無にかかわらず、これを確認してください。

public class ScaleView extends View {

private final ScaleGestureDetector mScaleGestureDetector;

public ScaleView(Context context, AttributeSet attrs) {
    super(context, attrs);


    //setScaleX(0.9f);
    //setScaleY(0.9f);

    mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureDetector.OnScaleGestureListener() {

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            // does nothing intentionally
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            setPivotX(detector.getFocusX());
            setPivotY(detector.getFocusY());
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return false;
        }
    });
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mScaleGestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}
}

ピボットが変更される前と同じビューの位置を設定するにはどうすればよいですか?

4

2 に答える 2

10

問題を解決しました。作業コードは次のとおりです。

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
    float newX = detector.getFocusX();
    float newY = detector.getFocusY();
    setTranslationX(getTranslationX() + (getPivotX() - newX) * (1 - getScaleX()));
    setTranslationY(getTranslationY() + (getPivotY() - newY) * (1 - getScaleY()));
    setPivotX(newX);
    setPivotY(newY);
    return true;
}

主な問題は、スケーリングされたビューでピボットがどのように機能するかを理解することです。そうすれば、ピボットの奇妙な動作に問題はありません。

于 2013-01-25T13:39:09.510 に答える