2013-01-19 9 views
12

पर अजीब काम करता है मुझे पता चला कि setPivotX (setPivotY) एंड्रॉइड में अजीब काम करता है। यदि आप दृश्य स्केल को 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

यह मेरे लिए एंड्रॉइड में एक बग जैसा लगता है। एक पिवट बिंदु के बारे में स्केलिंग पिवट को अनुवाद करके, पैमाने का प्रदर्शन करके और वापस अनुवाद करके किया जाता है। 'सेटस्केले' संचालन यह करना चाहिए, और दृश्य को चारों ओर कूदना नहीं चाहिए। स्केलिंग एक ऐसा ऑपरेशन है जो दृश्यमान रूप से दृश्यों का अनुवाद नहीं करना चाहिए। –

+0

हाय, मैंने एक ही समस्या पर ठोकर खाई है और इसे आपके उत्तर के साथ ठीक करने में सक्षम था। हालांकि, मुझे अभी भी आश्चर्य है, पायलट स्केल किए गए विचारों पर कैसे काम करता है। क्या आप कुछ दिशानिर्देश, या शायद एक लिंक प्रदान कर सकते हैं? अग्रिम धन्यवाद। – aleien

+0

@aleien क्षमा करें मैं आपकी मदद नहीं कर सकता, मुझे नहीं लगता कि पिवट बिंदुओं का उपयोग करके विचारों को स्केल करने के बारे में कोई दिशानिर्देश है। – tomrozb

0

@aleien, मैं आपके प्रश्न का उत्तर दे सकता हूं। एक नया पिवट सेट करते समय, देखें गुणों का पुनर्मूल्यांकन किया जाएगा। एंड्रॉइड मूल दृश्य को नए पिवट के साथ पुन: सहेजता है, लेकिन उसी स्केल वैल्यू जो नए स्केल किए गए दृश्य की ओर जाता है, पुराने पुराने दृश्य के बीच ऑफसेट होता है। इस ऑफ़सेट का सामना करने के लिए ऑफ़सेट केवल (getPivotX() - newX) * (1 - getScaleX()) है, हम setTranslationX() का उपयोग कर सकते हैं। आशा है कि मेरा जवाब आपकी मदद कर सकता है!

+0

आपके संपादन के लिए धन्यवाद, @ मारियो निकोलस – Ryan

संबंधित मुद्दे