2013-01-19 47 views
12

我發現,setPivotX(也setPivotY)在Android中奇怪的作品。如果在視圖的比例設置爲1.00時設置pivot,則不會發生任何事情(只是透視更改)。但是,如果比例不等於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中的一個bug給我。通過轉換到數據透視圖,執行縮放並翻譯回來完成關於樞軸點的縮放。 'setScale'操作應該這樣做,View不應該跳過。縮放是一種不應該可視化翻譯視圖的操作。 –

+0

嗨,我偶然發現了同樣的問題,並能夠解決它與您的答案。但是,我仍然想知道,如何在縮放視圖上工作。你能提供一些指導方針,或者可能是一個鏈接? 在此先感謝。 – aleien

+0

@aleien抱歉,我不能幫你,我不認爲有任何關於使用樞軸點縮放視圖的指導原則。 – tomrozb

0

@aleien,我可以回答你的問題。設置新的透視圖時,視圖的屬性將被重新計算。 Android使用新的數據透視表重新縮放原始視圖,但是導致新縮放視圖的相同比例值在舊縮放視圖之間存在偏移。抵消只是(getPivotX() - newX) * (1 - getScaleX()),爲了抵消這種抵消,我們可以使用setTranslationX()。希望我的回答能幫助你!

+0

感謝您的編輯,@馬里奧尼古拉斯! – Ryan