2012-11-08 18 views
6

WebViewにはassetsフォルダ内にローカルHTMLページが表示されています。 WebViewActivityの大きなレイアウトの一部です。私はEditTextウィジェットのテキストをWebViewの入力要素にドラッグできるようにしようとしています。ドラッグリスナーが受け取った画面座標をdocument.elementFromPointが使用する画面座標に変換する以外はすべて正常に機能します。彼らは一致しません。それは入力ボックスにテキストを落とし続けるでしょう。入力ボックスはユーザーの指の下にあります。どんな助けもありがとう。警告:私のjavascriptの知識はかなり哀れです。ビューのタッチ位置をWebViewのHTML画面位置に変換する

基本フロー:

  1. のWebViewのonDragイベントはACTION_DROPイベントをキャッチ。
  2. イベントのX、Y位置はJavaScript関数に渡される
  3. Javascript機能要素点に基づいて、私の活動に

値を更新発見:

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のラッパー。

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

javascript関数:

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

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

答えて

8

コンバージョンをもっと複雑にしてから、必要なものにしていました。 AndroidのWebViewとWebPageの両方は、表示可能なビューポートのサイズに基づいて独自の座標系を持っています。はい、両方とも異なるサイズのビューポートを報告します。両方のビューポートをスクロールすることはできますが、スクロールした変更を含める必要はありません。単純な式:

DE =いるDragEvent
WV = WebViewの

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

は私のコードは、今どのように見えるか:活動の

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ラッパー:

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

のJavascript機能:

<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

こんにちはジェイ、この素晴らしいソリューションのおかげで、私は座標を翻訳する最良の方法を見つけようと頭を叩きながら数時間を過ごす:) Btw、あなたはあなたのオブジェクトをドラッグしている間にいくつか問題があったのですか?たとえば、私はこの "ドラッグが進行中だが、ドラッグウィンドウのハンドルはありません"を取得し続け、そのために私のタッチ上の移動イベントがトリガを停止するためです。ここに私のコードがあります。https://gist.github.com/anonymous/8161cae250a9f0c9002a – ShP

+0

これはあいまいに聞こえますが、完全に思い出すことはできません。 3年が経過し、このコードにアクセスできなくなりました。 –

+0

私のためにもうまく働いた。ありがとう! – Shilpi

関連する問題