第二节-安卓多屏双屏实战车载车机智能驾驶舱开发/千里马android framwork开发

这篇具有很好参考价值的文章主要介绍了第二节-安卓多屏双屏实战车载车机智能驾驶舱开发/千里马android framwork开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

hi,粉丝朋友们!
上一节已经对车载的多屏互动进行了相关的技术方案介绍,以及相关的核心方法
moveRootTaskToDisplay的讲解和使用。
具体可以参考链接:https://blog.csdn.net/learnframework/article/details/130461689
本节就来进行代码实战

1、方案设计

要实现双屏互动,主要就只需要两个步骤:
1、手指动作识别
2、识别动作后触发寻找display,获取顶部task,触发moveTask操作
android 多屏方案,wms,android,java,开发语言

2、手势动作识别部分

触发手势设计:因为模拟器实现条件有限,所以这里采用是双指向右移动一定距离触发。
首先要进行对手指全局移动的监听,针对多个手指的触摸移动动作要进行识别。
代码实现:
单独建立一个PointerEventListener的实现子类叫做DoubleScreenMovePointerEventListener,在这里面的onPointerEvent方法即可以实现对应的触摸动作识别,这里实现是双指同时滑动触摸方式:

diff --git a/services/core/java/com/android/server/wm/DoubleScreenMovePointerEventListener.java b/services/core/java/com/android/server/wm/DoubleScreenMovePointerEventListener.java
new file mode 100644
index 000000000000..f9c765476d19
--- /dev/null
+++ b/services/core/java/com/android/server/wm/DoubleScreenMovePointerEventListener.java
@@ -0,0 +1,62 @@
+package com.android.server.wm;
+
+import android.view.MotionEvent;
+import android.view.WindowManagerPolicyConstants;
+
+public class DoubleScreenMovePointerEventListener implements WindowManagerPolicyConstants.PointerEventListener {
+    boolean shouldBeginMove = false;
+    int mPoint0FirstX = 0;
+    int mPoint1FirstX = 0;
+
+    int mPoint0LastX = 0;
+    int mPoint1LastX = 0;
+    int START_GAP = 20;//动作触发阈值,最少移动为20个像素才可以
+    private final WindowManagerService mService;
+
+    public DoubleScreenMovePointerEventListener(WindowManagerService mService, DisplayContent mDisplayContent) {
+        this.mService = mService;
+        this.mDisplayContent = mDisplayContent;
+    }
+
+    private final DisplayContent mDisplayContent;
+
+    @Override
+    public void onPointerEvent(MotionEvent motionEvent) {
+        android.util.Log.i("DoubleScreenTouch","DoubleScreenMovePointerEventListener onPointerEvent motionEvent = "+motionEvent);
+        switch (motionEvent.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN:
+            case MotionEvent.ACTION_POINTER_DOWN:
+                if (motionEvent.getPointerCount() > 2) {
+                    shouldBeginMove = false;
+                    android.util.Log.i("DoubleScreen","DoubleScreenMovePointerEventListener motionEvent.getPointerCount() > 2 end DoubleScreenMove ");
+                }
+                if (motionEvent.getPointerCount() == 2) {
+                    if (mPoint0FirstX == 0 && mPoint1FirstX == 0) {
+                        mPoint0FirstX = (int)motionEvent.getX(0);
+                        mPoint1FirstX = (int)motionEvent.getX(1);
+                    }
+                }
+                break;
+           case MotionEvent.ACTION_MOVE:
+               if (motionEvent.getPointerCount() == 2) {
+                   if (!shouldBeginMove && motionEvent.getX(0)  - mPoint0FirstX > START_GAP &&
+                           motionEvent.getX(1)  - mPoint1FirstX > START_GAP) { //识别了双指动作达到触发task移动条件,则调用对应mDisplayContent.doTestMoveTaskToOtherDisplay方法
+                       android.util.Log.i("DoubleScreen","DoubleScreenMovePointerEventListener start DoubleScreenMove ");
+                       shouldBeginMove = true;
+                       mDisplayContent.doTestMoveTaskToOtherDisplay();
+                   }
+
+                   mPoint0LastX = (int)motionEvent.getX(0);
+                   mPoint1LastX = (int)motionEvent.getX(1);
+               }
+               break;
+           case MotionEvent.ACTION_POINTER_UP:
+           case MotionEvent.ACTION_UP:
+               shouldBeginMove = false;
+               mPoint0FirstX = mPoint1FirstX =0;
+               android.util.Log.i("DoubleScreen","DoubleScreenMovePointerEventListener ACTION_UP end DoubleScreenMove ");
+               break;
+       }
+    }
+
+}

同时不要忘记需要把这个PointEventListener让displaycontent注册监听:

@@ -1063,7 +1085,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
         // 1. All physical displays (multi-display).
         // 2. VirtualDisplays on VR, AA (and everything else).
         mTapDetector = new TaskTapPointerEventListener(mWmService, this);//需要传递WMS和DisplayContent方便调用
+        mDoubleScreenMoveListener = new DoubleScreenMovePointerEventListener(mWmService, this);
         registerPointerEventListener(mTapDetector);
+        registerPointerEventListener(mDoubleScreenMoveListener);
         registerPointerEventListener(mWmService.mMousePositionTracker);
         if (mWmService.mAtmService.getRecentTasks() != null) {
             registerPointerEventListener(

3、寻找当前Display的Task,移动到目标display
触摸动作识别后会调用DisplayContent的doTestMoveTaskToOtherDisplay方法来完成剩下的业务:
1、获取要移动到的目标display对象
2、获取当前display要移动的Task对象
3、调用RootWindowContainer的moveRootTaskToDisplay方法来实现

+//add by doublescreenmove
+    public void doTestMoveTaskToOtherDisplay() {
+        DisplayContent otherDisplay = null;
+        if (mRootWindowContainer.getChildCount() == 2) {//检测是不是双屏
+            otherDisplay = (mRootWindowContainer.getChildAt(0) == this) ? mRootWindowContainer.getChildAt(1):mRootWindowContainer.getChildAt(0);//获取另一个屏幕的DisplayContent
+        }
+        if (otherDisplay!= this && otherDisplay!= null) {
+            int rootTaskId = 0;
+            try {
+                Task rootTask = getTopRootTask();//获取当前display的顶部Task
+                if (rootTask.isActivityTypeHome()) {//home类型的task不支持移动
+                    android.util.Log.i("DoubleScreen","doTestMoveTaskToOtherDisplay isActivityTypeHome");
+                    return;
+                }
+                rootTaskId =rootTask.mTaskId;
+                mRootWindowContainer.moveRootTaskToDisplay(rootTaskId,otherDisplay.mDisplayId,true);//把task移动到另一屏
+            }catch (Exception e) {
+                android.util.Log.i("DoubleScreen","doTestMoveTaskToOtherDisplay Exception",e);
+            }
+        }
+    }
+ //end  by doublescreenmove

成果展示:
android 多屏方案,wms,android,java,开发语言

模拟器调试要点:

这个部分请关注bibili的 视频
https://www.bilibili.com/video/BV1Tv4y1J7eb文章来源地址https://www.toymoban.com/news/detail-703401.html

到了这里,关于第二节-安卓多屏双屏实战车载车机智能驾驶舱开发/千里马android framwork开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Android自带模拟器模拟车载多屏显示

    由于车机设备资源不够,可采用 Android Studio 自带模拟器来模拟车机多屏显示,如下图所示模拟一个Activity在不同屏幕显示 更新Android Studio: 配置AVD参数 Android SDK:12 开启第二块屏幕 按如下截图4个步骤,设置Second Display的分辨率和屏幕密度 查看当前屏幕ID信息,用下面adb命令

    2024年02月16日
    浏览(63)
  • 安卓11双屏双背光修改方法

    安卓11上调双屏异显功能,系统驱动默认支持双背光功能,老一点的系统不支持双背光驱动,所以老版本的双屏异显都是同时控制2个屏的背光,客户也没做特别要求,新版本客户有这个需求了,所以就想办法去实现;底层已经出现了2个背光节点,但是上层就没有做这个功能,

    2024年02月04日
    浏览(27)
  • 云计算实战应用案例精讲-【自动驾驶】多模态融合智能检测方法及 SLAM 车载实现(论文篇)

    目录 基于多模态融合的人机协同模型与算法研究 感知与识别技术 2.1 手势信息的感知与识别

    2024年02月11日
    浏览(33)
  • 第二章(第二节):无穷小量和函数

    若 lim f(x) = 0 , 则称函数 f(x) 当 x → x 0 时是无穷小量,简称: 无穷小 。      x→ x 0 定理1. 有限多个 无穷小量的代数和仍是无穷小量 定理2. 有限多个 无穷小量的积也是无穷小量 定理3.常数与无穷小量的积也是无穷小量 定理4.有界变量与无穷小量的积是无穷小量 当 x→

    2024年02月08日
    浏览(34)
  • 第二节 LwIP简介

    本专栏使用的是LwIP 2.1.2版本 ,官方下载链接:http://savannah.nongnu.org/projects/lwip/。 本专栏以LwIP 2. 1.2 为主要对象进行讲解,后续中出现的LwIP 如果没有特殊声明,均指2.1.2 版本。此时的LwIP 2. 1.2 为最新版本,可能当这本书写完的时候,LwIP 又被更新了,对于学习而言,大家其实

    2024年02月03日
    浏览(30)
  • 计算机网络 第二节

    目录 一,计算机网络的分类 1.按照覆盖范围分 2.按照所属用途分 二,计算机网络逻辑组成部分 1.核心部分 (通信子网) 1.1电路交换 1.2 分组交换 两种方式的特点     重点 2.边缘部分  (资源子网) 进程通信的方式: 三,计算机网路性能指标 1.速度指标 2.时间指标 3.往返

    2024年02月10日
    浏览(26)
  • 第二节 LVGL移植

    确定输入、输出设备 输入:触摸屏、鼠标、键盘以及编码器;输出:显示屏 准备LVGL库、例程 准备V8.2版本的LVGL库文件,还有支持所需功能的例程源码 添加LVGL库到工程 按需裁剪、修改LVGL库文件,并添加到MDK工程中 配置输入、输出设备 适配自己的输入和输出设备,添加所需

    2024年02月06日
    浏览(29)
  • 华为HCIP第二节-------------------------ISIS

    IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是ISO (International Organization for Standardization,国际标准化组织)为它的CLNP(ConnectionLessNetwork Protocol,无连接网络协议)设计的一种动态路由协议。 is-is是一个链路状态协议。 NET相当于ospf中routeid+区域ID NET(Networ

    2024年02月15日
    浏览(79)
  • Datawhale 学习git-第二节

    2.3 查看提交历史 -git log 简单查看提交历史 使用 git log 不带任何参数,会按时间先后顺序列出所有提交,最新的排在最上面。 默认显示的信息包括提交的哈希值、作者信息、日期和提交信息。 查看详细的提交差异 使用 git log -p 或 git log --patch 查看每次提交的详细差异(补丁

    2024年02月19日
    浏览(23)
  • C++学习——第二节课-输入输出

    大家好,我是涵子。今天我们来学习C++中的输入输出。 目录 一、电脑中的输入输出 二、C++中的输入输出 2.1.输入并输出 2.2.cin的用法 2.3.多个输入  三、变量 3.1.声明 3.2.赋值 四、总结 日常生活中常见的电脑、手机、电视机外部接口,也就是I/O(输入/输出)接口部分,其样式

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包