2012-07-05 11 views
7

I Bild einzige Runde zu drehen, ich versuche, von diesem Mittelpunkt, aber ich bin nicht in der Lage auf Wunsch Position zu stoppen, wie ich Drehung tun können, aber ich will Drehung nach 360'(1 round) stoppen.Rotation anhält des Bildes nach 360' Grad

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

Rotation Methode @

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

} 

Ihre Vorschläge spürbar sind.

+0

In welche Richtung Sie drehen möchten? Ich meine im Uhrzeigersinn/gegen den Uhrzeigersinn? –

+0

In beiden Richtung Uhr und gegen den Uhrzeigersinn. – Maulik

Antwort

3

Sie haben zur vorherigen rot Wert zu speichern. Und Check-in updateRotation Methode hinzufügen, wenn previousRot auf der linken Seite von 360' Grad und rot ist auf der rechten Seite von 360' Grad dann haben wir 1 Runde und Drehen muss aufhören.

Beispielcode für den Uhrzeigersinn Fall

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

Für entgegen dem Uhrzeigersinn Fall ist es fast das gleiche, aber die Werte vertauscht

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

Dieser Code wird Drehung stoppen. Von Anfang an previousRot sollte


Ein anderer Ansatz 0 für Recht Fall und 359,99 für gegen den Uhrzeigersinn sein ist eine weitere Variable hinzuzufügen insgesamt gefahrenen Winkel zu speichern. Von Anfang an traveledAngle haben gleich 0 sein Und wenn Sie im Uhrzeigersinn sind Dreh haben Sie es durch die Differenz zwischen rot und previousRot zu erhöhen. Wenn Sie gegen den Uhrzeigersinn drehen, verringern Sie den Wert um den gleichen Wert.

traveledAngle += rot - previousRot; 

traveledAngle Wenn mehr als 360' wird zu müssen Sie Drehen im Uhrzeigersinn zu stoppen, und wenn es kleiner als 0, muss in Drehrichtung gegen den Uhrzeigersinn stoppen.

+0

Wie kann ich den Winkel mehr als 360' Grad bekommen? Es wird von 1 'auf 360' erhöht. nach 360 'dauert es 1' Grad. – Maulik

+0

Das stimmt! Für den Uhrzeigersinn sollte 'previousRot' 350-360 'und' rot' ungefähr 0-10 'sein. Aber diese Zahlen sind nur zum Beispiel angegeben, es kann 300-360 'und 0-60' sein. Die Hauptidee ist mit 'previousRot' Wert – vasart

+0

Okay. Aber wie kann ich die Rotation mit previousRot stoppen? wenn ich 1 'nach einer Drehung bin und mein previousRot-Wert 360' ist? Und was sollte Logik gegen den Uhrzeigersinn sein? – Maulik

2

ich Ihre Demo verwendet haben, und fügte hinzu, einige Logik, die neuere Demo ist als unten:

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

Es gibt 2 Nebenwirkungen. 1.] Starten der Drehung im Uhrzeigersinn vom linken Teil ODER 2.] Starten der Drehung gegen den Uhrzeigersinn von der rechten Hälfte. In diesen beiden Fällen wird das Bild um 1,5 Umdrehungen gedreht.Das ist die Begrenzung meiner Logik bis zu dieser Zeit. Wenn ich es aktualisieren werde, informiere ich Sie. –

+0

@Maulik, Wenn Sie versuchen, meine Demo und irgendein Problem, dann informieren Sie mich, indem Sie hier kommentieren. –

Verwandte Themen