2012-07-05 8 views
7

Sto provando a ruotare il round singolo dell'immagine dal suo punto centrale ma non riesco a fermarmi alla posizione di desiderio poiché posso ruotare ma voglio interrompere la rotazione dopo 360'(1 round).Arresta la rotazione dell'immagine dopo 360 'gradi

public class RotateRoundActivity extends Activity implements OnTouchListener 
{ 

    private ImageView dialer; 
    //private float y=0; 
    private float x=0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     dialer = (ImageView) findViewById(R.id.big_button); 
     dialer.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    // double r=Math.atan2(event.getX()-dialer.getWidth()/2, dialer.getHeight()/2-event.getY()); 

     double r=Math.atan2(event.getX()-dialer.getWidth()/2, dialer.getHeight()/2-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; 
    } 

metodo di rotazione @

private void updateRotation(double rot){ 
     float newRot=new Float(rot); 
     Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); 
     Matrix matrix=new Matrix(); 
     matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight()); 
     Log.i("demo===>", "matrix==>" + matrix); 
    // Log.i("demo===", "y===>" + y); 
     Log.i("demo===", "x===>" + x); 

     if(x>250){ 
      Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); 
      dialer.setImageBitmap(reDrawnBitmap); 
     } 
     else{ 
      Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); 
      dialer.setImageBitmap(reDrawnBitmap); 
     } 
    } 

} 

I tuoi suggerimenti sono apprezzabili.

+0

In quale direzione si vuole ruotare? Intendo in senso orario/antiorario? –

+0

In entrambi i registri di direzione e in senso antiorario. – Maulik

risposta

3

È necessario salvare il valore precedente rot. E aggiungi il check-in nel metodo updateRotation se previousRot è alla sinistra di 360 'gradi e rot è a destra di 360' gradi, quindi abbiamo effettuato 1 round e dobbiamo smettere di ruotare.

Codice di esempio per caso orario

if (previousRot >= 300 && previousRot <= 360 && rot >= 0 && rot <= 60) { 
    rot = 359.99; // or here can be 360' 
} 

Per caso antiorario è quasi la stessa, ma i valori scambiati

if (previousRot >= 0 && previousRot <= 60 && rot >= 300 && rot <= 360) { 
    rot = 0; 
} 

Questo codice si arresta la rotazione. Dall'inizio previousRot dovrebbe essere 0 per il caso in senso orario e antiorario 359.99 per contatore


Un altro approccio è quello di aggiungere una variabile più per memorizzare angolo totale percorsa. Dall'inizio traveledAngle deve essere uguale a 0. E se stai ruotando in senso orario, devi aumentarlo della differenza tra rot e previousRot. Quando si ruota in senso antiorario diminuirlo dello stesso valore.

traveledAngle += rot - previousRot; 

Quando traveledAngle diventa superiore a 360' è necessario smettere di ruotare in senso orario, e quando diventa inferiore a 0, è necessario smettere di ruotare in senso antiorario.

+0

Come posso ottenere un angolo superiore a 360 °? Aumenterà da 1 'a 360'. dopo 360 'ci vuole 1' grado. – Maulik

+0

Proprio così! Per la direzione in senso orario 'previousRot' dovrebbe essere 350-360 'e' rot' dovrebbe essere circa 0-10'. Ma questi numeri sono dati solo per esempio, possono essere 300-360 'e 0-60'. L'idea principale è usare il valore 'previousRot' – vasart

+0

Ok. ma come posso fermare la rotazione usando previousRot? se sono a 1 'dopo una rotazione e il mio valore precedenteRot è 360' allora? E quale dovrebbe essere la logica in senso antiorario? – Maulik

2

Ho usato il tuo demo e ha aggiunto un po 'di logica, la demo più recente è la seguente:

public class RotateRoundActivity extends Activity implements OnTouchListener { 
    float rot1=0.0F, rot2=0.0F; 
    boolean clockwise, rotationDone = false, halfrotated = false; 
    int rotcall=0; 

    private ImageView dialer; 
    //private float y=0; 
    private int x=0; 
    //private int y=0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     dialer = (ImageView) findViewById(R.id.big_button); 
     dialer.setOnTouchListener(this); 
    } 

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

     return true; 
    } 

    private void updateRotation(double rot){ 
     float newRot = new Float(rot); 

     rotcall++; 
     if(rotcall == 1) 
      rot1 = new Float(rot); 
     if(rotcall == 2) 
      rot2 = new Float(rot); 
     if(rot1 != 0.0F && rot2 != 0.0F) 
      if(rot1 < rot2) 
       clockwise = true; 
      else 
       clockwise = false; 
     System.out.println("Rotate :: "+newRot); 

     if(clockwise && rot1>=0) { 
      if(newRot < 0) 
       halfrotated = true; 
      if(halfrotated && newRot > 0) 
       rotationDone = true; 
      if(rotationDone) 
       newRot = 0; 
     } 
     if(clockwise && rot1<0) { 
      if(newRot > 0) 
       halfrotated = true; 
      if(halfrotated && newRot < 0) 
       rotationDone = true; 
      if(rotationDone) 
       newRot = 0; 
     } 
     if(!clockwise && rot1<0) { 
      if(newRot > 0) 
       halfrotated = true; 
      if(halfrotated && newRot < 0) 
       rotationDone = true; 
      if(rotationDone) 
       newRot = 0; 
     } 
     if(!clockwise && rot1>=0) { 
      if(newRot < 0) 
       halfrotated = true; 
      if(halfrotated && newRot > 0) 
       rotationDone = true; 
      if(rotationDone) 
       newRot = 0; 
     } 

     System.out.println("Rotation Done :: "+rotationDone); 

     if(!rotationDone) { 
      //BitmapDrawable bitmapDrawable = (BitmapDrawable) dialer.getDrawable(); 
      //Bitmap bitmap = bitmapDrawable.getBitmap(); 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
        R.drawable. YOUR_DRBL ); 
      int width = bitmap.getWidth(); 
      int height = bitmap.getHeight(); 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(newRot, width, height); 
      System.out.println("x===>" + x); 
      //System.out.println("y===>" + y); 

      //if (x > 250) { 
       Bitmap reDrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 
       dialer.setImageBitmap(reDrawnBitmap); 
      /*} else { 
       Bitmap reDrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
         width, height, matrix, true); 
       dialer.setImageBitmap(reDrawnBitmap); 
      }*/ 
     } 
    } 

} 
+0

Ci sono 2 effetti collaterali. 1.] Avvio della rotazione in senso orario partendo dalla parte sinistra O 2). Avvio della rotazione in senso antiorario dalla metà della parte destra. In entrambi i casi, ruota l'immagine per 1,5 rotazioni.Questa è la mia limitazione logica fino a questo momento. Se lo aggiornerò, ti informerò. –

+0

@ Maulik, Se provi la mia demo e ottieni qualche problema, informami commentando qui. –