2012-11-08 10 views
6

Mam WebView, który wyświetla lokalną stronę HTML w folderze zasobów. WebView jest częścią większego układu w postaci Activity. Próbuję umożliwić użytkownikom przeciąganie tekstu z widżetu EditText do elementu wejściowego w ramach WebView. Wszystko działa dobrze, z wyjątkiem konwersji współrzędnych ekranu odebranych przez odbiornik drag na współrzędne ekranu używane przez document.elementFromPoint. Nie pasują do siebie. Będzie on nadal upuszczał tekst do pól wejściowych, które znajdują się niżej niż palec użytkownika. Każda pomoc będzie doceniona. Uwaga: moja znajomość javascriptu jest dość żałosna.Konwersja położenia dotyku widoku na położenie ekranu HTML w przeglądarce Web View

przepływ podstawowy: wydarzenie

  1. Webview za onDrag łapie zdarzenie ACTION_DROP.
  2. x imprezy, y lokalizacja jest przekazywane do funkcji JavaScript
  3. Funkcja JavaScript znajdzie element oparty na punkty i aktualizuje wartość

W moim działalność:

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 owijarki:

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

Funkcja Javascript:

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

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

Odpowiedz

8

Wyliczyłem to. Sprawiało, że konwersja była bardziej skomplikowana niż to, co musiało być. Zarówno Android WebView, jak i WebPage mają własny układ współrzędnych oparty na rozmiarze widocznego portu. Tak, oba raporty wyświetlają porty o różnych rozmiarach. Mimo że oba porty widoku można przewijać, nie ma potrzeby uwzględniania tych przewijanych zmian. Prosty wzór:

de = DragEvent
WV = WebView

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

Jak mój kod wygląda teraz:

W Aktywny:

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 funkcja:

<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

Witam @Jay, dzięki za to wspaniałe rozwiązanie. Spędzam kilka godzin waląc głową, próbując znaleźć najlepszy sposób na przetłumaczenie współrzędnych :) Btw, czy masz jakiś problem podczas przeciągania obiektu? Na przykład otrzymuję to "Przeciąganie jest w toku, ale nie ma uchwytu okna przeciągania" i z tego powodu moje zdarzenie przestawienia ruchu z wciśniętym dotykiem zatrzymuje się. Oto mój kod dla tego https://gist.github.com/anonymous/8161cae250a9f0c9002a – ShP

+0

To brzmi trochę znajomo, ale nie mogę całkowicie przypomnieć. Minęły 3 lata i nie mam już dostępu do tego kodu. –

+0

Sprawdziło się również dla mnie. Dzięki! – Shilpi

Powiązane problemy