2013-07-04 35 views
8

Tôi đang gặp sự cố khi sử dụng lớp VelocityTracker. Theo dõi vận tốc dường như hoạt động rất tốt nếu bạn đang đo tốc độ của các sự kiện cảm ứng trên một chế độ xem không chuyển động, nhưng ngay khi khung nhìn bắt đầu di chuyển bằng ngón tay của bạn (sử dụng dịchYY/X hoặc setY/X), vận tốc là hoàn toàn ngẫu nhiên (tôi nghĩ rằng vận tốc được tính bằng cách sử dụng vị trí của khung nhìn?). Có ai có bất cứ đề nghị để có được một vận tốc chính xác của phong trào của bạn khi swiping một cái nhìn?Theo dõi vận tốc của chế độ xem chuyển động

Ghi chú: Tôi đang sử dụng các sự kiện liên lạc từ tính năng onTouchListener của Chế độ xem của tôi để theo dõi Tốc độ.

Chúc mừng

Trả lời

0

Giả sử bạn không co giãn, vận tốc của một lần chạm là số tiền ngón tay bạn đã di chuyển, chia cho thời gian. Thời gian dễ dàng - chỉ yêu cầu thời gian hệ thống tính bằng mili giây trên mỗi sự kiện và subtrace. Đối với chế độ xem đã dịch, bạn muốn đảm bảo rằng bạn sử dụng cùng một khung tham chiếu. Về cơ bản, theo dõi độ lệch x và y của chế độ xem được thiết lập bằng cách dịch nó và thêm độ lệch của lần chạm vào nó để lấy tổng số bù đắp của ngón tay của bạn so với gốc. Chỉ so sánh những con số đó để theo dõi vận tốc của bạn.

Nếu bạn cũng đang phóng to chế độ xem, chế độ xem sẽ phức tạp hơn. Bạn cần phải làm cùng một loại toán học với yếu tố tỷ lệ. Về cơ bản, bạn đang dịch tất cả các điểm vào cùng một hệ thống tham chiếu.q

+0

OK. Điều đó nghe có vẻ khá dễ dàng. Tôi đã hy vọng sử dụng lớp VelocityTracker và đã làm nó cho tôi, nhưng có lẽ tôi sẽ tự mình thực hiện nó như bạn nói. –

8

Bạn nên theo dõi số lượt xem đã được di chuyển và gọi MotionEvent.offsetLocation để "sửa" tọa độ sự kiện trước khi chuyển đến một số VelocityTracker.

private float mLastX; 
private float mTranslationX; 
private VelocityTracker mTracker; 

@Override 
public boolean onTouch(final View view, MotionEvent motionEvent) { 
    motionEvent.offsetLocation(mTranslationX, 0); 

    switch (motionEvent.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: 
     mLastX = motionEvent.getRawX(); 
     mTracker = VelocityTracker.obtain(); 
     mTracker.addMovement(motionEvent); 
     return true; 

    case MotionEvent.ACTION_MOVE: 
     mTranslationX += motionEvent.getRawX() - mLastX; 
     view.setTranslationX(mTranslationX); 
     mTracker.addMovement(motionEvent); 
     return true; 

    case MotionEvent.ACTION_UP: 
     // get your correct velocity from mTracker 
     ... 
    } 
} 

Kiểm tra tài liệu cho MotionEvent.getRawX/Y quá.

Chúng trả về tọa độ X/Y của con trỏ liên quan đến toàn bộ màn hình, do đó chúng không bị ảnh hưởng bởi chuyển động của bất kỳ chế độ xem nào bạn đang nghe.

-1

Tôi nghĩ bạn đang nói về chuyển động của máy ảnh, như theo dõi vận động viên trong thời gian thực. Nếu vậy, chỉ có một cách: Trong khi chụp chuyển động, bạn cần một điểm cố định, giống như quả bóng tennis trong mặt đất để trừ đi vận tốc của bóng tĩnh thành "một khớp" trong vận động viên. Để làm điều này là cần thiết để có được tọa độ X, Y trong khung ban đầu và cuối cùng của đối tượng tĩnh để tạo sự khác biệt cho đối tượng chuyển động.

Di chuyển đối tượng: Quảng trường ((X vị trí cuối cùng-X vị trí ban đầu)^2 + (Y vị trí cuối cùng-Y vị trí ban đầu)^2) sau đó chuyển đổi pixel để mét hoặc dặm sau đó chia kết quả bằng giây (còn cần một convertion từ miliseconds) bạn nhận được km/h và mp/h cho đối tượng chuyển động.

Thực hiện tất cả các bước cho đối tượng tĩnh. Trừ kết quả từ đối tượng tĩnh sang đối tượng chuyển động.

Điều tương tự cũng áp dụng cho hoạt động thu phóng. Tất cả các thao tác đều là thủ công. Nếu bạn muốn vận tốc thực sự trong thời gian thực, bạn cần theo dõi tự động không phù hợp với android. Trong bóng đá, sử dụng 4 camera bạn cần quadprocessors với tối thiểu 3000Mhz. Tôi khuyên dùng Matlab.

2

Các thỏa thuận cách đơn giản nhất với tọa độ tuyệt đối viết:

motionEvent.setLocation(e.getRawX(), e.getRawY());

+0

Nếu bạn mong đợi MotionEvent được sử dụng ở nơi khác, trước tiên hãy tạo một bản sao của MotionEvent bằng cách sử dụng MotionEvent.obtain(). –

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