2011-12-16 39 views
14

Tôi phải kéo một số chế độ xem trên màn hình. Tôi đang sửa đổi vị trí của mình bằng cách thay đổi bên trái và đầu các thông số bố cục của họ từ sự kiện chuyển động trên ACTION_MOVE từ trình xử lý cảm ứng. Có cách nào để "kéo" các mục trơn tru hơn không? Bởi vì tis loại "kéo" không hề mượt mà ... Đây là mã sốchế độ xem kéo android mượt mà

public boolean onTouch(View view, MotionEvent motionEvent) { 
    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      dx = (int) motionEvent.getX(); 
      dy = (int) motionEvent.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      int x = (int) motionEvent.getX(); 
      int y = (int) motionEvent.getY(); 
      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
      int left = lp.leftMargin + (x - dx); 
      int top = lp.topMargin + (y - dy); 
      lp.leftMargin = left; 
      lp.topMargin = top; 
      view.setLayoutParams(lp); 
      break; 
    } 
    return true; 
} 
+1

thử sử dụng mã của tôi ở đây: http://stackoverflow.com/a/18806475/878126 tôi nghĩ rằng nó khá trơn tru. –

+0

[Android Draggable View] (http://www.singhajit.com/android-draggable-view/) –

+0

Tôi chỉ tải lên một video hướng dẫn trên Youtube về cách làm cho bất kỳ chế độ xem nào có thể kéo được chỉ với một lớp trợ lý đơn giản. Kiểm tra xem nó ra: https://youtu.be/licui_5_iLk –

Trả lời

0

Sẽ hữu ích khi xem bạn đang xử lý các sự kiện ACTION_MOVE của mình như thế nào. Bạn có sử dụng tất cả các điểm bằng phương thức event.getHistorical() không? Nếu điều đó không mang lại cho bạn một thao tác kéo mượt mà, ý tưởng khác có thể là nội suy các điểm trên đường dẫn. Tôi tin rằng sẽ có một sự cân bằng giữa việc đạt được sự mượt mà của chuyển động và phản ứng nhanh với cảm ứng của người dùng. HTH.

+0

vui lòng xem mã đính kèm –

+0

Bạn đang sử dụng kéo bên trong một ScrollView? @gabi – MGDroid

1

Lý do di chuyển không trơn tru là giá trị nguyên của leftMargin và topMargin.
Để có vị trí di chuyển mượt mà nên nổi.
This có thể trợ giúp.

+2

LayoutParams yêu cầu ints ở đó. –

21

Cố gắng sử dụng motionEvent.getRawX() và motionEvent.getRawY() thay vì GetY và GetX

+0

Bạn đã cứu tôi, cảm ơn. –

0

Bạn nên tròn ints của bạn, cũng sử dụng lợi nhuận sẽ không thể rất trơn tru, sử dụng một cách bố trí khác nhau và thiết lập X và Y tọa độ theo kích thước màn hình.

2

Bạn không cần sử dụng LayoutParameters để kéo. Bạn có thể làm điều đó bằng cách chỉ thiết lập tọa độ X và Y của chế độ xem. Bạn có thể đọc thêm về điều này here.

Bạn có thể làm điều gì đó như thế này.

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     break; 

     case MotionEvent.ACTION_MOVE: 
     view.setY(event.getRawY() + dY); 
     view.setX(event.getRawX() + dX); 
     break; 

     default: 
     return false; 
    } 
    return true; 
    } 
+0

video tuyệt vời công việc tốt đẹp –

+0

nhưng tại sao chúng ta nên thêm delta không phải là quan điểm phải di chuyển đến vị trí con trỏ mới mà không có không gian đó. –

Các vấn đề liên quan