2012-07-10 20 views
6

Sto provando a ruotare uno dei PNG trasparenti su questa immagine. La parte numero è ciò che voglio ruotare. Sono in grado di fare questo, ma non è quello che sto cercando di realizzareAndroid, aiuta a ruotare l'immagine al tocco

http://i48.tinypic.com/25exzle.png

voglio ruotare i numeri come su un vero lucchetto a combinazione. Quindi l'utente toccherà e muoverà le dita in un cerchio. Ho osservato una rotazione dell'immagine meno precisa sugli eventi touch/move e non erano sufficienti.

questo è attualmente il mio codice

public boolean onTouch(View v, MotionEvent event) { 
    double r=Math.atan2(event.getX()-lockNumbers.getWidth(), lockNumbers.getHeight()-event.getY()); 
    int rotation=(int)Math.toDegrees(r); 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      x=event.getX(); 
      y=event.getY(); 
      updateRotation(rotation); 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
    }//switch  

    return true; 

}//onTouch 
private void updateRotation(double rot){ 
    float newRot=new Float(rot); 
    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.numbers); 
    Matrix matrix=new Matrix(); 
    matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight()); 
    if(y>250){ 
     Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); 
     lockNumbers.setImageBitmap(reDrawnBitmap); 
    } 
    else{ 
     Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); 
     lockNumbers.setImageBitmap(reDrawnBitmap); 
    } 
} 

si ridimensiona anche il bitmap quando si tocca a causa del parametro matrix. Questo non è l'effetto desiderato.

All'utente verrà richiesto di andare in cerchio con le dita.

risposta

6

Scrivi sotto il codice nel tuo evento touch.

switch (event.getAction()) {  
    case MotionEvent.ACTION_DOWN: 
     // reset the touched quadrants 
     for (int i = 0; i < quadrantTouched.length; i++) { 
      quadrantTouched[i] = false; 
     } 
     allowRotating = false; 
     startAngle = getAngle(event.getX(), event.getY()); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     double currentAngle = getAngle(event.getX(), event.getY()); 
     rotateDialer((float) (startAngle - currentAngle)); 
     startAngle = currentAngle; 
     break; 
    case MotionEvent.ACTION_UP: 
     allowRotating = true; 
     break; 
} 

// set the touched quadrant to true 
quadrantTouched[getQuadrant(event.getX() - (dialerWidth/2), dialerHeight - event.getY() - (dialerHeight/2))] = true; 
detector.onTouchEvent(event); 
return true; 

E utilizzare sotto il collegamento per ulteriori riferimenti.

Rotate Dialer Example

+0

come posso rilevare quanta rotazione è stata eseguita sull'evento ACTION_UP? – IronBlossom

0

Suppongo di voler ruotare un'immagine nel punto in cui un utente tocca lo schermo? Se è così, estendere il SimpleOnGestureListener come in questo esempio:

public class MyGestureDetector extends SimpleOnGestureListener 
{ 
    @Override 
    public void onLongPress(MotionEvent event) 
    { 
     int X = (int)event.getX();   
     int Y = (int)event.getY(); 

     ...Rotate the image 
    } 
} 

Una volta che hai le coordinate dello schermo del touch dell'evento, è possibile applicare un'animazione di rotazione intorno al punto - vedi qui per maggiori dettagli: http://developer.android.com/guide/topics/graphics/2d-graphics.html

+0

Non proprio, sto usando MotionEvent.ACTION_MOVE, non suLongPress, e quindi cambio la rotazione dell'immagine al volo. Non è lo stesso che toccare, aspettare e quindi fare un'animazione di rotazione. – CQM

1

Accettando @Dipak Keshariya's risposta che mi sto mettendo modo per ottenere l'angolo di rotazione, che può aiutare a identificare selezionato parte di ruota.

private float copy[] = new float[9]; 
    matrix.getValues(copy); 
float wheelAngle = Math.round(Math.atan2(copy[Matrix.MSKEW_X], 
       copy[Matrix.MSCALE_X]) * (180/Math.PI)); 
Problemi correlati