2012-11-08 22 views
6

Öğeler klasöründe yerel bir HTML sayfası görüntüleyen bir WebView var. WebView, Activity numaralı telefondan daha büyük bir düzeneğin bir parçasıdır. Kullanıcıların EditText widget'ından gelen metni WebView içindeki bir Giriş Öğesine sürüklemelerine izin vermeye çalışıyorum. Her şey, sürükleyici dinleyici tarafından alınan ekran koordinatlarının document.elementFromPoint tarafından kullanılan ekran koordinatlarına dönüştürülmesi dışında iyi çalışır. Eşleşmiyorlar. Daha sonra kullanıcılar parmağından daha aşağı olan giriş kutularına metni bırakmaya devam edecektir. Herhangi bir yardım takdir edilecektir. Uyarı: Javascript bilgim oldukça acıklı.View'ın dokunmatik konumunu WebView'un HTML ekran konumuna dönüştürme

Temel akışı:

  1. WebView ondrag olay ACTION_DROP olayı yakalar.
  2. etkinliğin x, y konumu
  3. JavaScript işlevi eleman noktaları dayalı bulur bir JavaScript işlevi geçirilen ve benim Aktivite olarak değerini

günceller edilir:

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 sarıcı:

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

JavaScript işlevi:

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

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

cevap

8

Figured out out. Dönüşümü daha karmaşık hale getiriyordu, ne olması gerekiyordu. Hem Android'in WebView hem de WebPage, görünür görünüm bağlantı noktalarının boyutuna göre kendi koordinat sistemine sahiptir. Evet, her ikisi de farklı boyutlu görünüm portlarını bildiriyor. Her iki görüntüleme noktası da kaydırılabilir olsa da, bu değişmiş değişiklikleri eklemenize gerek yoktur. Basit bir formül:

DE = DragEvent
Batı = WebView

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

benim kod artık görünüyor nasıl: Bir Etkinlikte

:

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 sarıcı:

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

JavaScript işlevi:

<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

Merhaba @Jay, bu harika çözüm için teşekkürler. Birkaç saatimi harcayarak, koordinatları tercüme etmenin en iyi yolunu bulmaya çalışıyorum :) Btw, nesneyi sürüklerken bir sorun mu var? Örneğin, bunu devam ettiriyorum "Sürükleme devam ediyor, ancak sürükle penceresi tutamağı yok" ve bunun nedeni benim dokunma hareketim olayı durdurmayı tetikliyor. İşte bu benim için kodum https://gist.github.com/anonymous/8161cae250a9f0c9002a – ShP

+0

Bu çok tanıdık geliyor ama tamamen hatırlayamıyor. 3 yıl geçti ve artık bu kodlara erişimim yok. –

+0

Benim için de iyi çalıştı. Teşekkürler! – Shilpi

İlgili konular