2012-07-05 21 views
7

Görüntüyü tek bir noktadan orta noktadan döndürmeye çalışıyorum, ancak rotasyon yapabileceğim gibi arzu pozisyonunda duramıyorum ama 360'(1 round)'dan sonra rotasyonu durdurmak istiyorum. Önerileriniz kayda değer bulunmaktadır360 ° derecelik görüntüden sonra görüntü dönüşünü durdurun

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

} 

@

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

Rotasyon yöntemi.

+0

hangi yönde döndürmek istediğiniz? Saat yönünde mi yoksa saat yönünün tersine mi? –

+0

Her iki yönde de saat yönünde ve saat yönünün tersine. – Maulik

cevap

3

Önceden rot değerini kaydetmeniz gerekiyor. previousRot'un 360 ° derece solunda ve rot'un 360 ° derece sağında ise updateRotation yönteminde kontrol ekleyin ve ardından 1 tur yaptık ve dönmeyi durdurun. saat yönünün tersi durum için saat yönünde durumda

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

için

örnek kod hemen hemen aynıdır, ancak değerleri

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

Bu kod dönmesini durdurur değiştirdiler. Başlangıçta previousRot itibaren saat yönünün tersine başka bir yaklaşım, toplam seyahat açıyı depolamak için bir daha değişken eklemektir


için saat yönünde durum için 0 ve 359.99 olmalıdır. traveledAngle başından itibaren 0'a eşit olmak zorunda. Ve eğer saat yönünde dönüyorsanız, rot ve previousRot arasındaki farkla onu arttırmanız gerekir. Saat yönünün tersine döndürüldüğünde, aynı değerde azaltın. traveledAngle daha büyük 360' olduğunda

traveledAngle += rot - previousRot; 

Eğer saat yönünde dönen durdurmak gerekir ve bu daha az 0 olduğunda, sayaç, saat yönünde döndürme durdurmak gerekir.

+0

Açıyı 360 dereceden daha fazla nasıl alabilirim? 1 'ila 360' arasında artış olacaktır. 360 'sonra 1' derece alır. – Maulik

+0

Bu doğru! Saat yönünde 'previousRot' 350-360 ',' rot 'ise 0-10 arasında olmalıdır. Ancak bu rakamlar sadece örnek olarak verilebilir, 300-360 've 0-60' olabilir. Ana fikir 'previousRot' değeri – vasart

+0

Tamam kullanıyor. ama previousRot kullanarak rotasyonu nasıl durdurabilirim? eğer bir rotasyondan sonra 1 'de ve önceki Root'um 360 değerindeysem? Ve saat yönünün tersine ne mantıklı olmalı? – Maulik

2

Ben senin demo kullanılan ve bazı mantık eklemiş, yeni demo aşağıdaki gibidir:

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

2 tane yan etkisi var. 1.] Sol hale gelen parçadan saat yönünde dönme başlangıcı VEYA 2.] Sağ yarım kısımdan saat yönünün tersine dönüş başlatılıyor. Bu iki durumda da, 1.5 rotasyon için görüntüyü döndürür.Bu benim mantığımın bu zamana kadarki sınırlaması. Eğer onu güncellerseniz, u bilgilendiririm. –

+0

@Maulik, Demolarımı denerseniz ve herhangi bir sorunla karşılaşırsanız, bana yorum yaparak bana bilgi verin. –

İlgili konular