Android:WebView 触摸事件监听器

Posted

技术标签:

【中文标题】Android:WebView 触摸事件监听器【英文标题】:Android: WebView touch event listener 【发布时间】:2019-01-27 14:37:05 【问题描述】:

是否可以在我在 webview 上定义的屏幕的某些部分启用/禁用触摸事件?

【问题讨论】:

据我所知不是直接的。你能在WebView 上添加一个(透明的)视图吗?这将拦截触摸事件。 【参考方案1】:

可以在你的网页中通过javascript定义你的动作,然后在你的android代码中触发一个java方法

正如提到的here 定义如下接口:

/** Instantiate the interface and set the context  */
class WebAppInterface(private val mContext: Context) 

    /** Show a toast from the web page  */
    @JavascriptInterface
    fun showToast(toast: String) 
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
    

然后附加到webView

val webView: WebView = findViewById(R.id.webview)
webView.addJavascriptInterface(WebAppInterface(this), "Android")

你应该在你的网页中实现如下功能,并在需要时触发它

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

<script type="text/javascript">
    function showAndroidToast(toast) 
        Android.showToast(toast);
    
</script>

【讨论】:

我可能没有在这个问题上说清楚。我不是在问如何触发某些功能,而是在问是否可以在我的 Android 上的 webview 上进行,我只定义了一些区域来捕捉视图中的触摸,而不是整个视图。就像视图上的一些部分.. @That_some_guy 是与页面内容相关的区域还是只是屏幕的特定部分? 在屏幕上,例如webView的左上角、右下角有按钮,其余的内容是透明的,让用户使用应用程序。 webview 大小是屏幕的大小。 webview上的触摸仅在左上角和右下角启用,其余禁用。 @That_some_guy 看看这篇文章***.com/questions/3476779/…【参考方案2】:

实际上现在 webview 不支持 Touch Actions。但是有一些解决方法可用;我将通过一个 longpress 示例来展示它:我正在使用 Pointoption,因为我将获取元素的坐标并将其用于 longpress。

public void longpress(PointOption po) 
   //first you need to switch to native view
    driver.switchToNativeView();
    TouchAction action = new TouchAction((PerformsTouchActions) driver);
    action.longPress(po).waitAction(WaitOptions.waitOptions(Duration.ofSeconds(2)));
    action.release();
    action.perform();
    driver.switchToDefaultWebView();

为了得到我在methood下设计的元素的坐标

public PointOption getElementLocation(WebElement element) 
    int elementLocationX;
    int elementLocationY;

    //get element location in webview
    elementLocationX = element.getLocation().getX();
    elementLocationY = element.getLocation().getY();

    //get the center location of the element
    int elementWidthCenter = element.getSize().getWidth() / 2;
    int elementHeightCenter = element.getSize().getHeight() / 2;
    int elementWidthCenterLocation = elementWidthCenter + elementLocationX;
    int elementHeightCenterLocation = elementHeightCenter + elementLocationY;

    //calculate the ratio between actual screen dimensions and webview dimensions
    float ratioWidth = device.getDeviceScreenWidth() / ((MobileDevice) device)
            .getWebViewWidth().intValue();
    float ratioHeight = device.getDeviceScreenHeight() / ((MobileDevice) device)
            .getWebViewHeight().intValue();

    //calculate the actual element location on the screen , if needed you can increase this value,for example i used 115 for one of my mobile devices.
    int offset = 0;  


    float elementCenterActualX = elementWidthCenterLocation * ratioWidth;
    float elementCenterActualY = (elementHeightCenterLocation * ratioHeight) + offset;
    float[] elementLocation = elementCenterActualX, elementCenterActualY;

    int elementCoordinateX, elementCoordinateY;
    elementCoordinateX = (int) Math.round(elementCenterActualX);
    elementCoordinateY = (int) Math.round(elementCenterActualY);
    PointOption po = PointOption.point(elementCoordinateX, elementCoordinateY);
    return po;

现在您有一个 longpress(PointOption po) 和 getElementLocation(Webelement element) 方法可以为您提供 po。现在一切准备就绪,您可以按如下方式使用它们..

longpress(getElementLocation(driver.findElement(By.id("the selector can be any of them(xpath,css,classname,id etc.)")));
 

【讨论】:

以上是关于Android:WebView 触摸事件监听器的主要内容,如果未能解决你的问题,请参考以下文章

Android WebView 触摸事件链接

Android将触摸事件传递给WebView的内部内容

检查 Android WebView 是不是正在使用触摸事件

Android系统全局触摸事件监听

Android webview中的js如何监听键盘事件

Android R PointerEventDispatcher 触摸事件监听帮助类