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); } }
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.
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.
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); } }
`
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With