2013-01-19 10 views
12

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); 
} 
} 

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

答えて

8

私はこの問題を解決しました。

@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; 
} 

主な問題は、ピボットがどのようにスケーリングされたビューで動作するかを理解し、奇妙なピボット動作に問題があってはならないことです。

+5

これはAndroidのバグのようです。ピボットポイントについてのスケーリングは、ピボットに平行移動し、スケールを実行し、元に戻すことによって実行されます。 'setScale'オペレーションはこれを実行していて、Viewはジャンプしてはいけません。スケーリングは、ビューを視覚的に翻訳すべきではない操作です。 –

+0

こんにちは、私は同じ問題を遭遇し、あなたの答えでそれを修正することができました。しかし、私はまだ疑問に思っています。あなたはいくつかのガイドラインを提供することができますか? ありがとうございます。 – aleien

+0

@aleien申し訳ありませんが、私はあなたを助けることができない、私はピボットポイントを使用してビューを拡大縮小に関するガイドラインはないと思う。 – tomrozb

0

@aleien、私はあなたの質問に答えることができます。新しいピボットを設定すると、ビューのプロパティが再計算されます。 Androidは新しいピボットで元のビューを再スケーリングしますが、新しいスケーリングビューにつながる同じスケーリング値は古いスケーリングビュー間にオフセットを持ちます。オフセットはちょうど(getPivotX() - newX) * (1 - getScaleX())で、このオフセットに対抗するためにsetTranslationX()を使用できます。私の答えがあなたを助けることを願っています!

+0

あなたの編集のために感謝、@マリオニコラウス – Ryan

関連する問題