2012-07-05 16 views
7

के बाद छवि के घूर्णन को रोकें, मैं अपने केंद्र बिंदु से छवि एकल राउंड घुमाने की कोशिश कर रहा हूं लेकिन मैं रोटेशन करने के लिए इच्छा स्थिति पर रुकने में सक्षम नहीं हूं लेकिन मैं 360'(1 round) के बाद रोटेशन को रोकना चाहता हूं।360 डिग्री

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

रोटेशन पद्धति @

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

} 

आपके सुझाव सराहनीय हैं।

+0

किस दिशा में आप बारी बारी से करना चाहते हैं? मेरा मतलब घड़ी की दिशा में/घड़ी की दिशा में है? –

+0

दोनों दिशा घड़ी और anticlockwise दोनों में। – Maulik

उत्तर

3

आपको पिछले rot मान को सहेजना होगा। और updateRotation विधि में चेक जोड़ें यदि previousRot 360 डिग्री और rot के बाईं ओर 360 डिग्री के दायीं तरफ है तो हमने 1 गोल किया और घूर्णन रोकने की आवश्यकता है। दक्षिणावर्त मामले

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

काउंटर दक्षिणावर्त मामले के लिए के लिए

नमूना कोड में यह लगभग एक ही है, लेकिन मूल्यों

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

इस कोड को रोटेशन बंद हो जाएगा बदली। शुरुआत previousRot से काउंटर दक्षिणावर्त


एक और दृष्टिकोण गयी कुल कोण स्टोर करने के लिए एक और चर जोड़ने के लिए है के लिए और 359.99 दक्षिणावर्त मामले के लिए 0 होना चाहिए। शुरुआत से traveledAngle को 0 के बराबर होना चाहिए। और यदि आप घड़ी की दिशा में घूम रहे हैं तो आपको rot और previousRot के बीच के अंतर से इसे बढ़ाना होगा। घड़ी के विपरीत घूर्णन करते समय इसे उसी मान से कम करें।

traveledAngle += rot - previousRot; 

जब traveledAngle से अधिक 360 'बन जाता है आप घड़ी की दिशा में घूर्णन को रोकने के लिए की जरूरत है, और जब यह 0 से कम हो जाता है, तो आप काउंटर घड़ी की दिशा में घूर्णन को रोकने के लिए की जरूरत है।

+0

मैं 360 डिग्री से अधिक कोण को कैसे प्राप्त कर सकता हूं? यह 1 'से 360' तक बढ़ जाएगा। 360 के बाद 'यह 1 डिग्री लेता है। – Maulik

+0

यह सही है! घड़ी की दिशा के लिए 'पिछला रोट' 350-360 होना चाहिए ', और' सड़ांध 'लगभग 0-10 होना चाहिए। लेकिन यह संख्या केवल उदाहरण के लिए दी जाती है, यह 300-360 'और 0-60' हो सकती है। मुख्य विचार 'पिछला रॉट' मान – vasart

+0

ठीक से उपयोग कर रहा है। लेकिन मैं पिछलेRot का उपयोग कर रोटेशन कैसे रोक सकता हूं? अगर मैं एक 'रोटेशन के बाद 1' पर हूं और मेरा पिछला रॉट वैल्यू 360 है तो? और anticlockwise के लिए तर्क क्या होना चाहिए? – Maulik

2

मैं अपने प्रदर्शन के लिए इस्तेमाल किया और कुछ तर्क को शामिल किया है, नए डेमो के रूप में नीचे है:

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 दुष्प्रभाव हैं। 1.] बाएं हेल भाग या 2 से रोटेशन घड़ी-वार शुरू करना।] दाएं आधे भाग से घूर्णन विरोधी घड़ी की शुरुआत करना। इन दोनों मामलों में, यह 1.5 रोटेशन के लिए छवि को घुमाता है।यह इस समय तक मेरे तर्क की सीमा है। अगर मैं इसे अपडेट कर दूंगा, तो मैं आपको सूचित करूंगा। –

+0

@ मौलिक, यदि आप मेरे डेमो को आजमाते हैं और कोई समस्या पाते हैं, तो मुझे यहां टिप्पणी करके सूचित करें। –

संबंधित मुद्दे