6

我有一个WebView在资产文件夹中显示本地 HTML 页面。WebView是较大布局的一部分Activity。我试图允许用户将文本从小EditText部件拖到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 回答