I am trying to rotate image single round from it's center point but I am not able to stop at desire position as I can do rotation but I want to stop rotation after 360'(1 round)
.
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 method@
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);
}
}
}
Your suggestions are appreciable.
You have to save previous rot
value. And add check in updateRotation
method if previousRot
is at the left of 360' degrees and rot
is at the right of 360' degrees then we made 1 round and need stop rotating.
Sample code for clockwise case
if (previousRot >= 300 && previousRot <= 360 && rot >= 0 && rot <= 60) {
rot = 359.99; // or here can be 360'
}
For counter clockwise case it is almost the same, but the values swapped
if (previousRot >= 0 && previousRot <= 60 && rot >= 300 && rot <= 360) {
rot = 0;
}
This code will stop rotation. From the beginning previousRot
should be 0 for clockwise case and 359.99 for counter clockwise
Another approach is to add one more variable to store total traveled angle. From the beginning traveledAngle
have to be equal to 0. And if you're rotating in clockwise direction you have to increase it by the difference between rot
and previousRot
. When rotating counter clockwise decrease it by the same value.
traveledAngle += rot - previousRot;
When traveledAngle
becomes greater than 360' you need to stop rotating in clockwise direction, and when it becomes less than 0, you need to stop rotating in counter clockwise direction.
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