setPivotX
(またはsetPivotY
)がAndroidで奇妙に動作することがわかりました。ビューの縮尺が1.00fに設定されているときにピボットを設定すると、何も起こりません(ピボットだけが変更されます)。しかし、スケールが1.0f(例えばsetScaleX(0.9f)
)でなく、ピボットを設定すると、ビューは新しいピボットに相対的に(?)移動します。それは不思議ではないですか?私は水平と垂直の位置(訳)はピボット値に関連していないが、1.0f以外の倍率でビューが移動する理由を知っていますか?setPivotXはスケーリングされたビューで異常に動作します
スケーリング部分の有無をご確認ください。
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);
}
}
ピボットが変更される前のビューの同じ位置を設定するにはどうすればよいですか?
これはAndroidのバグのようです。ピボットポイントについてのスケーリングは、ピボットに平行移動し、スケールを実行し、元に戻すことによって実行されます。 'setScale'オペレーションはこれを実行していて、Viewはジャンプしてはいけません。スケーリングは、ビューを視覚的に翻訳すべきではない操作です。 –
こんにちは、私は同じ問題を遭遇し、あなたの答えでそれを修正することができました。しかし、私はまだ疑問に思っています。あなたはいくつかのガイドラインを提供することができますか? ありがとうございます。 – aleien
@aleien申し訳ありませんが、私はあなたを助けることができない、私はピボットポイントを使用してビューを拡大縮小に関するガイドラインはないと思う。 – tomrozb