首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有d-pad导航的android电视颤振网页浏览

带有d-pad导航的android电视颤振网页浏览
EN

Stack Overflow用户
提问于 2020-04-06 15:47:43
回答 1查看 1.3K关注 0票数 1

我有一个简单的颤振应用程序,它已经很好地工作在安卓电视与d-pad遥控器。可以在小部件之间导航等等..。

Webview只加载初始值,但不响应任何d-pad键。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2020-05-16 13:31:26

颤振webview不适用于d控制器。我还试图为MiBoxTv创建应用程序,该应用程序将由遥控器控制。为了控制webview,我用RawKeyboardListener包装它,并用onKey方法捕获了rawKey events。根据虚拟指针的位置,我将单击事件发送到webview的控制器。下面我将放置我的示例代码。但是,使用这种方法,输入元素只有在鼠标指针点击后才能获得焦点。如果有人面对并解决了这个问题,请告诉我们你是如何做到的。

代码语言:javascript
复制
WebViewController _webViewController;

  int posX = 325;
  int posY = 300;
  bool topScrollBar = false;
  bool botttomScrollBar = false;

  handleKey(RawKeyEvent key, BuildContext context) {
    double height = MediaQuery.of(context).size.height;
    double width = MediaQuery.of(context).size.width;
    if (key.runtimeType.toString() == 'RawKeyDownEvent') {
      RawKeyEventDataAndroid data = key.data as RawKeyEventDataAndroid;
      String _keyCode;
      _keyCode = data.keyCode.toString();

      context.visitChildElements((element) {
        print(element.widget.key);
      });

      switch (_keyCode) {
        case '19': //up
          setState(() {
            posY -= 5;
            if (posY < 0) {
              posY = 0;
            }
          });
          break;
        case '22': //right
          setState(() {
            posX += 5;
            if (posX > width) {
              posX = width.toInt();
            }
          });
          break;
        case '20': //down
          setState(() {
            posY += 5;
            if (posY > height) {
              posY = height.toInt();
            }
          });
          break;
        case '21': //left
          setState(() {
            posX -= 5;
            if (posX < 0) {
              posX = 0;
            }
          });
          break;
        case '23': //OK
          _webViewController.evaluateJavascript("""            
            var cb = document.elementFromPoint($posX,$posY);
            cb.click();
            cb.focus(); 
            """);       
          break;
      }
    }

    if (posY < 5) {
      setState(() {
        topScrollBar = true;
      });
      _webViewController.scrollBy(0, -20);
    } else if (posY > height - 5) {
      setState(() {
        botttomScrollBar = true;
      });
      _webViewController.scrollBy(0, 20);
    } else {
      setState(() {
        topScrollBar = false;
        botttomScrollBar = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          RawKeyboardListener(
            focusNode: new FocusNode(),
            onKey: (key) => handleKey(key, context),
            child: WebView(
              initialUrl: 'https://google.com/',
              javascriptMode: JavascriptMode.unrestricted,
              initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow,
              onWebViewCreated: (WebViewController webViewController) {
                _webViewController = webViewController;
              },
              userAgent:
                  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
            ),
          ),
          Visibility(
            visible: topScrollBar,
            child: Positioned(
              top: 0,
              left: 0,
              right: 0,
              child: Container(
                height: 25,
                child: Center(
                  child: Icon(Icons.keyboard_arrow_up),
                ),
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    colors: [
                      Colors.blue.withOpacity(0.5),
                      Colors.white.withOpacity(0.5)
                    ],
                    begin: Alignment.topCenter,
                    end: Alignment.bottomCenter,
                  ),
                  border: Border(
                    bottom: BorderSide(
                      color: Colors.black.withOpacity(0.5),
                      width: 1,
                    ),
                  ),
                ),
              ),
            ),
          ),
          Visibility(
            visible: botttomScrollBar,
            child: Positioned(
              bottom: 0,
              left: 0,
              right: 0,
              child: Container(
                height: 25,
                child: Center(
                  child: Icon(Icons.keyboard_arrow_down),
                ),
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    colors: [
                      Colors.blue.withOpacity(0.5),
                      Colors.white.withOpacity(0.5)
                    ],
                    begin: Alignment.bottomCenter,
                    end: Alignment.topCenter,
                  ),
                  border: Border(
                    top: BorderSide(
                      color: Colors.black.withOpacity(0.5),
                      width: 1,
                    ),
                  ),
                ),
              ),
            ),
          ),
          Positioned(
              left: posX.toDouble(),
              top: posY.toDouble(),
              child: Image.asset(
                'assets/cursor.png',
                width: 18,
                height: 18,
              ))
        ],
      ),
      resizeToAvoidBottomInset: false,
    );
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61063663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档