2012-11-08 12 views
6

Tôi có một WebView đang hiển thị trang HTML cục bộ trong thư mục nội dung. WebView là một phần của bố cục lớn hơn trong một Activity. Tôi đang cố gắng cho phép người dùng kéo văn bản từ tiện ích EditText vào Phần tử nhập trong phạm vi WebView. Mọi thứ hoạt động tốt ngoại trừ việc chuyển đổi tọa độ màn hình nhận được bởi người nghe kéo đến tọa độ màn hình được sử dụng bởi document.elementFromPoint. Họ không phù hợp. Nó sẽ tiếp tục thả văn bản vào các ô đầu vào tiếp tục xuống sau đó là ngón tay người dùng. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảnh báo: kiến ​​thức javascript của tôi khá là thảm hại.Chuyển vị trí của Chế độ xem của Chế độ xem sang vị trí màn hình HTML của WebView

dòng chảy cơ bản: sự kiện onDrag

  1. WebView của bắt sự kiện ACTION_DROP.
  2. x của sự kiện, y vị trí sẽ được chuyển cho một hàm Javascript
  3. Chức năng Javascript thấy yếu tố dựa trên điểm và cập nhật các giá trị

Trong Hoạt động của tôi:

private class OnWebViewDragListener implements OnDragListener { 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DROP: 
       String dropText = event.getClipData().getItemAt(0).getText().toString(); 
       mJavaScript._dropText(mWebView, dropText, event.getX(), event.getY()); 
       return true; 

      default: 
       break; 
     } 

     return false; 
    } 
} 

Javascript wrapper:

public void _dropText(WebView wv, String text, float x, float y) { 
    wv.loadUrl("javascript:dropText('" + text + "', " + x + ", " + y + ")"); 
} 

Chức năng Javascript:

<script type="text/javascript"> 
function dropText(text, x, y) { 
    var elem = document.elementFromPoint(x, y); 

    if (elem.tagName == "INPUT") { 
     elem.value = text; 
    } 
} 
</script> 

Trả lời

8

Đã tìm ra. Đã làm cho việc chuyển đổi phức tạp hơn sau đó những gì nó cần phải được. Cả WebView của Android và WebPage đều có hệ tọa độ riêng của chúng dựa trên kích thước của cổng nhìn thấy được của chúng. Có cả báo cáo cổng có kích thước khác nhau. Mặc dù cả hai cổng xem đều có thể được cuộn, nhưng không cần phải bao gồm những thay đổi được cuộn. Công thức đơn giản:

DE = DragEvent
WV = WebView

x = DE.getX() * (window.innerWidth/WV.getWidth());
y = DE.getY() * (window.innerHeight/WV.getHeight());

Làm thế nào mã của tôi trông bây giờ:

Trong Hoạt động:

private class OnWebViewDragListener implements OnDragListener { 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DROP: 
       String dropText = event.getClipData().getItemAt(0).getText().toString(); 
       mJavaScript._dropText(mWebView, dropText, event.getX(), event.getY()); 
       return true; 

      default: 
       break; 
     } 

     return false; 
    } 
} 

Javascript wrapper:

public void _dropText(WebView wv, String text, float x, float y) { 
    wv.loadUrl("javascript:dropText('" + text + "', " + x + ", " + y + ", " + wv.getHeight() 
      + ", " + wv.getWidth() + ")"); 
} 

Javascript chức năng:

<script type="text/javascript"> 
function dropText(text, x, y, height, width) { 
    x *= (window.innerWidth/width); 
    y *= (window.innerHeight/height); 

    var elem = document.elementFromPoint(x, y); 

    if (elem.tagName == "INPUT") { 
     elem.value = text; 
    } 
} 
</script> 
+0

Xin chào @Jay, cảm ơn vì giải pháp tuyệt vời này. Tôi dành vài giờ đập đầu của tôi cố gắng tìm ra cách tốt nhất để dịch tọa độ :) Btw, bạn đã có một số vấn đề trong khi bạn kéo đối tượng của bạn? Ví dụ, tôi tiếp tục nhận được điều này "Kéo đang trong tiến trình nhưng không có xử lý cửa sổ kéo" và do đó sự kiện di chuyển trên chạm của tôi ngừng kích hoạt. Đây là mã của tôi cho https://gist.github.com/anonymous/8161cae250a9f0c9002a – ShP

+0

Nghe có vẻ quen thuộc nhưng không thể nhớ lại hoàn toàn. Đã 3 năm rồi và tôi không còn quyền truy cập vào mã này nữa. –

+0

Làm việc tốt cho tôi. Cảm ơn! – Shilpi