2012-07-10 34 views
6

Tôi đang cố gắng xoay một trong các PNG trong suốt trên hình ảnh này. Phần số là những gì tôi muốn xoay. Tôi có thể làm được điều này, nhưng nó không phải là những gì tôi đang cố gắng để đạtAndroid, giúp xoay hình ảnh khi chạm vào

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

Tôi muốn xoay số như trên một khóa kết hợp thực sự. Vì vậy, người dùng sẽ chạm và di chuyển ngón tay của họ trong một vòng tròn. Tôi đã xem xét việc xoay hình ảnh kém chính xác hơn trên các sự kiện chạm/di chuyển và chúng không đủ.

này hiện đang là mã của tôi

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

nó cũng thay đổi kích thước bitmap khi bạn chạm vào nó vì tham số ma trận. Đây không phải là hiệu ứng mong muốn.

Người dùng sẽ được yêu cầu phải đi theo vòng tròn bằng ngón tay của họ.

Trả lời

6

Viết mã bên dưới vào sự kiện liên lạc của bạn.

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; 

Và sử dụng liên kết bên dưới để tham khảo thêm.

Rotate Dialer Example

+0

làm thế nào tôi có thể phát hiện có bao nhiêu vòng quay đã được thực hiện trên sự kiện ACTION_UP? – IronBlossom

0

Tôi cho rằng bạn muốn xoay hình ảnh tại điểm mà người dùng chạm vào màn hình? Nếu vậy, kéo dài tuổi SimpleOnGestureListener như ví dụ sau:

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

     ...Rotate the image 
    } 
} 

Một khi bạn đã có tọa độ màn hình của sự kiện liên lạc, bạn có thể áp dụng một Rotation Animation về điểm - xem ở đây để biết thêm chi tiết: http://developer.android.com/guide/topics/graphics/2d-graphics.html

+0

Không hoàn toàn, tôi đang sử dụng MotionEvent.ACTION_MOVE, không onLongPress, sau đó thay đổi xoay hình ảnh khi đang di chuyển. Điều này không giống như chạm vào, chờ đợi, và sau đó làm một hình ảnh động xoay. – CQM

1

Bằng việc chấp nhận @Dipak Keshariya's câu trả lời tôi đang đặt cách để có được sự quay góc mà có thể giúp bạn xác định được lựa chọn một phần của bánh xe.

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)); 
Các vấn đề liên quan