2012-07-10 3 views
6

이 이미지에서 투명 PNG 중 하나를 회전하려고합니다. 숫자 부분은 내가 회전시키고 싶은 부분입니다. 나는이 작업을 수행 할 수 있어요,하지만 내가 진짜 조합 잠금에 같은 번호를 회전 할Android, 터치시 이미지 회전

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

그것은 또한 당신이 때문에 matrix 매개 변수의 만지지 비트 맵의 ​​크기를 조절합니다. 이것은 원하는 효과가 아닙니다.

사용자는 손가락으로 서클을 가야합니다.

답변

6

아래 코드를 터치 이벤트에 적는다.

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; 

자세한 내용은 아래 링크를 참조하십시오.

Rotate Dialer Example

+0

ACTION_UP 이벤트에서 얼마나 많은 회전이 수행되었는지 감지 할 수 있습니까? – IronBlossom

0

사용자가 화면을 터치하는 지점에서 이미지를 회전한다고 가정합니까? 그렇다면,이 예제처럼 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

+0

아니요, onLongPress가 아닌 MotionEvent.ACTION_MOVE를 사용하고 있습니다. 그리고 나서 이미지 회전을 변경하고 있습니다. 이것은 회전 애니메이션을 만지거나 대기 한 다음 회전 애니메이션과 동일하지 않습니다. – CQM

1

@Dipak Keshariya's 대답을 수락함으로써 난 당신이 바퀴의 일부를 선택 식별하는 데 도움이 각도 회전을 얻을 수있는 길을 걸었습니다.

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