6

WebViewアセットフォルダ内にローカルHTMLページを表示しているがあります。WebViewは、の大きなレイアウトの一部ですActivityEditTextユーザーがウィジェットから内の入力要素にテキストをドラッグできるようにしようとしていWebViewます。ドラッグリスナーが受信した画面座標を、が使用する画面座標に変換することを除いて、すべてが正常に機能しますdocument.elementFromPoint。それらは一致しません。ユーザーの指よりもさらに下にある入力ボックスにテキストをドロップし続けます。どんな助けでもいただければ幸いです。警告:私のJavaScriptの知識はかなり哀れです。

基本的な流れ:

  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>
4

1 に答える 1

10

理解した。変換を必要以上に複雑にしていました。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>
于 2012-11-12T19:13:07.250 に答える