Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pause canvas from rotating for 2 secs at specific angles?

Tags:

I made a rotating knob ,but I want to stop the knob at specific angles for 2 seconds. I want to stop it on 260f and -20f.

Can anyone suggest how to do it ?

This is the code from a blog. I made many changes according to my requirements.

public class RotatoryKnobView extends ImageView  {    private float angle = -20f;   private float theta_old=0f;    private RotaryKnobListener listener;    public interface RotaryKnobListener {     public void onKnobChanged(float arg);   }    public void setKnobListener(RotaryKnobListener l )   {     listener = l;   }    public RotatoryKnobView(Context context) {     super(context);     initialize();   }    public RotatoryKnobView(Context context, AttributeSet attrs)   {     super(context, attrs);     initialize();   }    public RotatoryKnobView(Context context, AttributeSet attrs, int defStyle)   {     super(context, attrs, defStyle);     initialize();   }    private float getTheta(float x, float y)   {     float sx = x - (getWidth() / 2.0f);     float sy = y - (getHeight() / 2.0f);      float length = (float)Math.sqrt( sx*sx + sy*sy);     float nx = sx / length;     float ny = sy / length;     float theta = (float)Math.atan2( ny, nx );      final float rad2deg = (float)(180.0/Math.PI);     float thetaDeg = theta*rad2deg;      return (thetaDeg < 0) ? thetaDeg + 360.0f : thetaDeg;   }    public void initialize()   {     this.setImageResource(R.drawable.rotoron);     setOnTouchListener(new OnTouchListener()       {  @Override  public boolean onTouch(View v, MotionEvent event) {    float x = event.getX(0);    float y = event.getY(0);    float theta = getTheta(x,y);     switch(event.getAction() & MotionEvent.ACTION_MASK)      {      case MotionEvent.ACTION_POINTER_DOWN:        theta_old = theta;        break;      case MotionEvent.ACTION_MOVE:        invalidate();        float delta_theta = theta - theta_old;        theta_old = theta;        int direction = (delta_theta > 0) ? 1 : -1;        angle += 5*direction;        notifyListener(angle+20);        break;      }    return true;  }       });   }    private void notifyListener(float arg)   {     if (null!=listener)       listener.onKnobChanged(arg);   }    protected void onDraw(Canvas c)   {if(angle==257f){       try {             synchronized (c) {                  c.wait(5000);                 angle=260f;             }          } catch (InterruptedException e) {         }   }   else if(angle==-16f)   {       try {             synchronized (c) {                 c.wait(5000);                 angle=-20f;             }          } catch (InterruptedException e) {          }   }   else       if(angle>260f)           {            angle=-20f;          }       else if(angle<-20f)           {            angle=260f;          }       else{           c.rotate(angle,getWidth()/2,getHeight()/2);           }     super.onDraw(c);   } }  
like image 525
Animesh Mangla Avatar asked Nov 17 '15 14:11

Animesh Mangla


People also ask

How do you stop a canvas from rotating?

Under Preferences -> Keyboard Shortcuts there is a Reset Rotation command which can be assigned a key command. I set mine to numpad zero which works wonderfully.

How do you lock rotation in canvas?

There actually is an on/off toggle for canvas rotation. Tap the Settings icon in the lower nav. Then from the menu that opens tap on Preferences. In the next menu you'll see a toggle for Free Canvas Rotation.


1 Answers

You may set a fixed angle and use postDelayed to clear it after 2 seconds.

    public class RotatoryKnobView extends ImageView {      private float angle = -20f;     private float theta_old=0f;      private RotaryKnobListener listener;      private Float fixedAngle;     private float settleAngle;      private Runnable unsetFixedAngle = new Runnable() {         @Override         public void run() {             angle = settleAngle;             fixedAngle = null;             invalidate();         }     };      public interface RotaryKnobListener {         public void onKnobChanged(float arg);     }      public void setKnobListener(RotaryKnobListener l )     {         listener = l;     }      public RotatoryKnobView(Context context) {         super(context);         initialize();     }      public RotatoryKnobView(Context context, AttributeSet attrs)     {         super(context, attrs);         initialize();     }      public RotatoryKnobView(Context context, AttributeSet attrs, int defStyle)     {         super(context, attrs, defStyle);         initialize();     }      private float getTheta(float x, float y)     {         float sx = x - (getWidth() / 2.0f);         float sy = y - (getHeight() / 2.0f);          float length = (float)Math.sqrt( sx*sx + sy*sy);         float nx = sx / length;         float ny = sy / length;         float theta = (float)Math.atan2( ny, nx );          final float rad2deg = (float)(180.0/Math.PI);         float thetaDeg = theta*rad2deg;          return (thetaDeg < 0) ? thetaDeg + 360.0f : thetaDeg;     }      public void initialize()     {         this.setImageResource(R.drawable.rotoron);         setOnTouchListener(new OnTouchListener()         {             @Override             public boolean onTouch(View v, MotionEvent event) {                 float x = event.getX(0);                 float y = event.getY(0);                 float theta = getTheta(x,y);                  switch(event.getAction() & MotionEvent.ACTION_MASK)                 {                     case MotionEvent.ACTION_POINTER_DOWN:                         theta_old = theta;                         break;                     case MotionEvent.ACTION_MOVE:                         invalidate();                         float delta_theta = theta - theta_old;                         theta_old = theta;                         int direction = (delta_theta > 0) ? 1 : -1;                         angle += 5*direction;                         notifyListener(angle+20);                         break;                 }                 return true;             }         });     }      private void notifyListener(float arg)     {         if (null!=listener)             listener.onKnobChanged(arg);     }      void setFixedAngle(float angle, float settleAngle) {         fixedAngle = angle;         this.settleAngle = settleAngle;         postDelayed(unsetFixedAngle, 2000);     }      protected void onDraw(Canvas c)     {         if(fixedAngle==null) {             if (angle > 270) {                 setFixedAngle(270, -15);             } else if (angle < -20f) {                 setFixedAngle(-20, 260);             }         }         Log.d("angle", "angle: " + angle + " fixed angle: " + fixedAngle);         c.rotate(fixedAngle == null ? angle : fixedAngle,getWidth()/2,getHeight()/2);          super.onDraw(c);     } } 

`

like image 186
Ugur Ozmen Avatar answered Sep 26 '22 06:09

Ugur Ozmen