Android, помогите вращать изображение при касании

Я пытаюсь повернуть один из прозрачных PNG на этом изображении. Часть номера – это то, что я хочу повернуть. Я могу это сделать, но это не то, что я пытаюсь достичь

http://i48.tinypic.com/25exzle.png

Я хочу повернуть числа, как на реальном кодовом замке. Таким образом, пользователь будет касаться и перемещать свой палец по кругу. Я смотрел на менее точное вращение изображения при касании / перемещении событий, и их было недостаточно.

Это мой код

public boolean onTouch(View v, MotionEvent event) { double r=Math.atan2(event.getX()-lockNumbers.getWidth(), lockNumbers.getHeight()-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; }//onTouch private void updateRotation(double rot){ float newRot=new Float(rot); Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.numbers); Matrix matrix=new Matrix(); matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight()); if(y>250){ Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); lockNumbers.setImageBitmap(reDrawnBitmap); } else{ Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); lockNumbers.setImageBitmap(reDrawnBitmap); } } 

Он также изменяет размер растрового изображения, когда вы касаетесь его из-за параметра матрицы. Это не желаемый эффект.

Пользователю в значительной степени потребуется пройти по кругу пальцем.

Напишите ниже код в ваше событие касания.

 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // reset the touched quadrants for (int i = 0; i < quadrantTouched.length; i++) { quadrantTouched[i] = false; } allowRotating = false; startAngle = getAngle(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: double currentAngle = getAngle(event.getX(), event.getY()); rotateDialer((float) (startAngle - currentAngle)); startAngle = currentAngle; break; case MotionEvent.ACTION_UP: allowRotating = true; break; } // set the touched quadrant to true quadrantTouched[getQuadrant(event.getX() - (dialerWidth / 2), dialerHeight - event.getY() - (dialerHeight / 2))] = true; detector.onTouchEvent(event); return true; 

И используйте ссылку ниже для получения дополнительной информации.

Пример поворотного набора

Принимая ответ @Dipak Keshariya, я ставил перед собой задачу получить угол поворота, который может помочь вам идентифицировать выбранную часть колеса.

 private float copy[] = new float[9]; matrix.getValues(copy); float wheelAngle = Math.round(Math.atan2(copy[Matrix.MSKEW_X], copy[Matrix.MSCALE_X]) * (180 / Math.PI)); 

Предполагаю, что вы хотите повернуть изображение в точке, где пользователь касается экрана? Если это так, расширьте SimpleOnGestureListener как в этом примере:

 public class MyGestureDetector extends SimpleOnGestureListener { @Override public void onLongPress(MotionEvent event) { int X = (int)event.getX(); int Y = (int)event.getY(); ...Rotate the image } } 

После того, как вы получили координаты экрана сенсорного события, вы можете применить анимацию вращения вокруг этой точки – подробнее см. Здесь: http://developer.android.com/guide/topics/graphics/2d-graphics.html