千里马android framework车机车载手机智能驾驶双屏互动实现方案

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

背景:

今年车展上,网友蚱蜢同学带回来了一些车载rom相关的一些素材,刚好也发布了wms/ams专题课程,有粉丝朋友提供了一个车机的双屏互动的产品交互视频如下:
android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

上面的就是车机两个屏幕的互动联动情况,转化成设计图如下:

android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

需求说明

这里对在个双屏需求进行要点细分:
1、通过多手指对屏幕1画面A进行拖动滑动

2、画面A可以跟随手指进行平移,即有跟手功能

3、拖到一定阈值时候松手,画面A会自动动画移动到屏幕2

4、拖动和动画过程画面A依旧是可以刷新的,不是截图

5、在没有达到滑动屏幕2阈值,则需要对画面进行动画返回原来屏幕1的原来位置

上面4个要点就是实现的核心部分,主要难度在以下几个方面:
1、多指全局动作监听,而不是在某个app的onTouch里面监听,这里其实之前的input专题课程是有讲解的
所以这里部分基本上学员都可以搞定

2、画面A的平移,两个屏幕都要进行显示,这个难度较大,得考虑好相关的画面怎么都可以显示在两个屏幕

3、画面A移动过程也可以进行刷新,这个相对截图画面A进行显示难度可能又大一些

4、移动后整个画面A就完全在屏幕2了

需求实现

看完需求,大概也就知道本质就是通过在屏幕1上面多指触摸画面A,然后画面A可以到达屏幕2

那么先不考虑动画体验相关,如果只实现一个最简单版本的双屏移动,哈哈,其实这个车展上也有的车厂就是这样实现的:
android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

这个就是没有动画版本的双屏互动,功能其实也是实现的,但是体验是不是感觉起来差的太多,而且还带有黑屏。。。
不过还好的是功能可以用,那么我们也根据wms课程基础后也来实现一下这个双屏互动的功能。

1、背景知识-wms的层级结构树
移动的画面A,其实一般就是我们Activity,一般在一个task中

android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

task一般是挂载在某个displaycontent下的TaskDisplayArea下面,具体如下图所示
android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

那么系统中有没有现成的方法就可以吧Task从这个display1移动到对应的diplay2下面呢?

答案当然是有的,方法就是RootWindowContainer里面的

/**
     * Move root task with all its existing content to specified display.
     *
     * @param rootTaskId Id of root task to move.
     * @param displayId  Id of display to move root task to.
     * @param onTop      Indicates whether container should be place on top or on bottom.
     */
    void moveRootTaskToDisplay(int rootTaskId, int displayId, boolean onTop) {
        final DisplayContent displayContent = getDisplayContentOrCreate(displayId);
        if (displayContent == null) {
            throw new IllegalArgumentException("moveRootTaskToDisplay: Unknown displayId="
                    + displayId);
        }

        moveRootTaskToTaskDisplayArea(rootTaskId, displayContent.getDefaultTaskDisplayArea(),
                onTop);
    }

    /**
     * Move root task with all its existing content to specified task display area.
     *
     * @param rootTaskId      Id of root task to move.
     * @param taskDisplayArea The task display area to move root task to.
     * @param onTop           Indicates whether container should be place on top or on bottom.
     */
    void moveRootTaskToTaskDisplayArea(int rootTaskId, TaskDisplayArea taskDisplayArea,
            boolean onTop) {
        final Task rootTask = getRootTask(rootTaskId);
        if (rootTask == null) {
            throw new IllegalArgumentException("moveRootTaskToTaskDisplayArea: Unknown rootTaskId="
                    + rootTaskId);
        }

        final TaskDisplayArea currentTaskDisplayArea = rootTask.getDisplayArea();
        if (currentTaskDisplayArea == null) {
            throw new IllegalStateException("moveRootTaskToTaskDisplayArea: rootTask=" + rootTask
                    + " is not attached to any task display area.");
        }

        if (taskDisplayArea == null) {
            throw new IllegalArgumentException(
                    "moveRootTaskToTaskDisplayArea: Unknown taskDisplayArea=" + taskDisplayArea);
        }

        if (currentTaskDisplayArea == taskDisplayArea) {
            throw new IllegalArgumentException("Trying to move rootTask=" + rootTask
                    + " to its current taskDisplayArea=" + taskDisplayArea);
        }
        rootTask.reparent(taskDisplayArea, onTop);//这里就是核心,把task重新挂载到了新display的taskDisplayArea

        // Resume focusable root task after reparenting to another display area.
        rootTask.resumeNextFocusAfterReparent();

        // TODO(multi-display): resize rootTasks properly if moved from split-screen.
    }

其实实现也很简单,就是吧task容器重新挂载到新的display的TaskDisplayArea

下面来实际调用一下这个方法的实际效果:
这里其实不需要写代码,可以直接调用am display相关的命令即可以实现这个方法的调用。
可以用am -h看看相关的命令帮助提示,有一个display参数:

  display [COMMAND] [...]: sub-commands for operating on displays.
       move-stack <STACK_ID> <DISPLAY_ID>
           Move <STACK_ID> from its current display to <DISPLAY_ID>.

使用方式就是:
am display move-stack taskid displayId

那么这里的taskid就是activity所在roottask的id,我们可以通过am stack list看到:

255|emulator_x86_64:/ # am stack list
RootTask id=420 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h797dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2876) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0}-455144485 s.24 fontWeightAdjustment=0}
  taskId=420: com.android.gallery3d/com.android.gallery3d.app.GalleryActivity bounds=[0,0][1440,2960] userId=0 visible=true topActivity=ComponentInfo{com.android.gallery3d/com.android.gallery3d.app.GalleryActivity}

RootTask id=1 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h797dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2876) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0}-454220964 s.24 fontWeightAdjustment=0}
  taskId=419: com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}

RootTask id=3 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h797dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2876) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0}-456068006 s.24 fontWeightAdjustment=0}
  taskId=3: unknown bounds=[0,0][1440,2960] userId=0 visible=false

RootTask id=4 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h797dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2876) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0}-456068006 s.24 fontWeightAdjustment=0}
  taskId=5: unknown bounds=[0,0][1440,2960] userId=0 visible=false
  taskId=6: unknown bounds=[0,0][1440,2960] userId=0 visible=false


可以看出com.android.gallery3d/com.android.gallery3d.app.GalleryActivity这Activity的对应RootTask id为:
RootTask id=420

dipslayId那就是屏幕的id,这个也可以通过如下命令获取:

test@test:~/Downloads$ adb shell dumpsys display | grep mDisplayId
adb server version (41) doesn't match this client (39); killing...
* daemon started successfully
    mDisplayId=0
    mDisplayId=2
  mDisplayId=0
  mDisplayId=2

一般默认屏幕就是0

所以这里如果要把com.android.gallery3d/com.android.gallery3d.app.GalleryActivity移动到display2命令如下:

am display move-stack 420 2

android 双屏互动,wms,android,framework,车载,车机,扩展屏应用开发

是不是明显看出来图库从屏幕1转到了屏幕2,屏幕1也有点闪黑
好,那我们下一节再进行具体代码实现,进行手势触摸实现
ps:需要相关代码和资料请加入下面微信公众号哈文章来源地址https://www.toymoban.com/news/detail-595743.html

到了这里,关于千里马android framework车机车载手机智能驾驶双屏互动实现方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android Framework最难模块WMS实战作业-手机车机系统开发必备

    0-整体介绍 1-window-container.mp4 窗口层级树实战启动篇 2-displayarea-feature.mp4 窗口层级树源码分析相关 3-displayarea-draw-feature.mp4 窗口层级树绘制实战1 4-displayarea-draw-leaf.mp4 窗口层级树绘制实战2 5-displayarea-draw-leaf-2.mp4 窗口层级树绘制实战3 6-displayarea-surfacelayer.mp4 窗口层级树相关sur

    2024年02月12日
    浏览(45)
  • android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

    直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/ 在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的 静态修改方案 使用命令查看display2即副屏的信息情况 adb shell dumpsys d

    2024年02月11日
    浏览(44)
  • 强固型工业电脑在码头智能化,龙门吊/流机车载电脑的行业应用

    码头智能化行业应用 对码头运营来说,如何优化集装箱从船上到码头堆场到出厂区的各个流程以及达到提高效率。 降低成本的目的,是码头营运获利最重要的议题。为了让集装箱码头客户能够安心使用TOS系统来调度指挥码头上各种吊车、叉车、拖车和人员,针对集装箱码头

    2024年04月22日
    浏览(29)
  • 评测凯迪仕K70「千里眼」智能锁:不忘安全初心,便捷体验更上一层

    能打败凯迪仕的,只有它自己。这是我们在体验过凯迪仕最新旗舰产品K70「千里眼」智能锁之后的感受。作为凯迪仕2023年最新旗舰机型,K70「千里眼」智能锁在配置上可以说是「机皇」般的存在。3K超高清智能锁猫眼、车规级24GHz雷达、大小双屏设计、三方可视对讲,以及各

    2024年02月12日
    浏览(36)
  • 使用AhMyth入侵Android智能手机

    首先如何破解Android智能手机以获得远程访问。在本教程中,我们将使用一个名为AhMyth的工具,这是一个开源远程访问工具AhMyth,它具有您希望在RAT中看到的许多功能,例如地理位置监控,SMS模块,联系人列表查看器,文件管理器,相机快照,麦克风录音机等等。AhMyth由于其简

    2024年02月02日
    浏览(31)
  • 1.1 Android 系统概述_智能手机系统介绍

    智能手机出现之后,各大手机厂商在利益的驱动之下,开发了各种智能手机操作系统, 并且大力“招兵买马”,抢夺市场份额。 Android 系统就是在这个历史背景下诞生的。 1.1.1 何谓智能手机 智能手机是指具有像个人计算机那样强大的功能,拥有独立操作系统的手机。用户可

    2024年02月09日
    浏览(56)
  • Android智能手机搜索不到路由器无线信号怎么办?

    本文介绍看Android智能手机搜索不到无线信号怎么办?相信有不少用户都遇到过这样的问题,使用Android智能手机连接无线WiFi的时候,发现搜索不到无线信号了。 其实Android智能手机搜索不到路由器上的无线WiFi信号,可能是由以下2个方面的原因引起的:1、手机设置问题;2、无

    2024年02月08日
    浏览(56)
  • 某手机大厂安卓framework开发面试机试经验分享

    hi,粉丝朋友们: 大家好!刚好现在处于一个金三银四的时间,很多同学都希望找个好的工作,这边刚好也有相关同学近期拿到了某手机大厂,具体啥大厂这里就不透露了,哈哈大家也很容易知道,需要机试的手机厂商就一两个,不给自己找麻烦,文章里面统一用某手机大厂

    2024年04月25日
    浏览(34)
  • Android Framework层开发

    查看源码工具: SourceInsight Instrumentation :可以理解为ActivityThread的一个工具类,在ActivityThread中初始化,一个进程只存在一个Instrumentation对象,在每个Activity初始化时,会通过Activity的Attach方法,将该引用传递给Activity。Activity所有生命周期的方法都有该类来执行。 Init进程(pi

    2024年02月04日
    浏览(42)
  • 【Android】Android Framework系列---CarPower电源管理

    智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。这些系统需要由汽车电源进行供电。由于汽车自身的特殊供电环境(相比手机方便的充电环境,汽车的蓄电池如果没有电是需要专业人士操作的),其电源状态会比较复杂,既要满足车内的座舱系统

    2024年02月07日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包