2013-01-19 15 views
12

Ho scoperto che setPivotX (anche setPivotY) funziona in modo strano in Android. Se imposti il ​​pivot quando la scala della vista è impostata su 1.00f non accade nulla (solo le modifiche di pivot). Ma se la scala non è uguale a 1,0f (ad esempio setScaleX(0.9f)) e si imposta il pivot, la vista si sposta relativamente (?) Al nuovo pivot. Non è strano? So che le posizioni orizzontali e verticali (traduzioni) NON sono correlate al valore pivot, ma perché la vista si sposta con un fattore di scala diverso da 1.0f?setPivotX funziona in modo anomalo Visualizza in scala

Controllare con e senza la parte di scalatura.

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

Come impostare la stessa posizione della vista, che era prima della modifica del pivot?

risposta

8

Ho risolto il problema. Ecco il codice di lavoro:

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

Il problema principale è quello di capire come funziona su perno viste in scala, quindi non ci dovrebbero essere problemi con il comportamento di rotazione strano.

+5

Questo mi sembra un bug in Android. Il ridimensionamento di un punto di rotazione viene eseguito convertendo il perno, eseguendo la scala e convertendone il valore. Le operazioni 'setScale' dovrebbero fare questo, e la vista non dovrebbe saltare. Il ridimensionamento è un'operazione che non dovrebbe tradurre visivamente le viste. –

+0

Ciao, mi sono imbattuto nello stesso problema ed è stato in grado di risolverlo con la tua risposta. Tuttavia, mi chiedo ancora come funziona il pivot su viste scalate. Potresti fornire alcune linee guida o forse un link? Grazie in anticipo. – aleien

+0

@aleien mi dispiace non posso aiutarti, non penso che ci siano delle linee guida sul ridimensionamento delle viste usando i punti pivot. – tomrozb

0

@aleien, posso rispondere alla tua domanda. Quando si imposta un nuovo pivot, le proprietà della vista verranno ricalcolate. Android riscala la vista originale con un nuovo pivot, ma lo stesso valore di scala che porta a una nuova visualizzazione in scala presenta un offset tra la vecchia visualizzazione in scala. L'offset è solo (getPivotX() - newX) * (1 - getScaleX()), per contrastare questo offset, possiamo usare setTranslationX(). Spero che la mia risposta possa aiutarti!

+0

grazie per il tuo editing, @ Mario Nikolaus – Ryan

Problemi correlati