2012-07-10 16 views
6

Estoy tratando de rotar uno de los PNG transparentes en esta imagen. La parte del número es lo que quiero rotar. Soy capaz de hacer esto, pero no es lo que estoy tratando de lograrAndroid, ayuda girando la imagen al tacto

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

Quiero girar los números como en una verdadera cerradura de combinación. Entonces, el usuario tocará y moverá su dedo en un círculo. Miré una rotación de imagen menos precisa en los eventos de tocar/mover, y no fueron suficientes.

este momento es mi código

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

también cambia el tamaño del mapa de bits cuando la toca porque el parámetro de matriz. Este no es el efecto deseado.

Se requiere que el usuario haga un círculo con el dedo.

Respuesta

6

Escriba el código a continuación en su evento táctil.

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; 

Y utilice el enlace de abajo para más referencia.

Rotate Dialer Example

+0

¿cómo puedo detectar cuánta rotación se ha realizado en el evento ACTION_UP? – IronBlossom

0

Supongo que quiere rotar una imagen en el punto donde el usuario toca la pantalla? Si es así, extender el SimpleOnGestureListener como en este ejemplo:

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

     ...Rotate the image 
    } 
} 

Una vez que tenga las coordenadas de la pantalla táctil del evento, se puede aplicar una animación de rotación alrededor del punto - ver aquí para más detalles: http://developer.android.com/guide/topics/graphics/2d-graphics.html

+0

No del todo, estoy usando MotionEvent.ACTION_MOVE, no en LongPress, y luego cambiar la rotación de la imagen sobre la marcha. Esto no es lo mismo que tocar, esperar y luego hacer una animación de rotación. – CQM

1

Al aceptar @Dipak Keshariya's respuesta Estoy poniendo manera de conseguir el ángulo de rotación que puede ayudarle a identificar seleccionó parte de la rueda.

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)); 
Cuestiones relacionadas