国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第二節(jié)-安卓多屏雙屏實戰(zhàn)車載車機智能駕駛艙開發(fā)/千里馬android framwork開發(fā)

這篇具有很好參考價值的文章主要介紹了第二節(jié)-安卓多屏雙屏實戰(zhàn)車載車機智能駕駛艙開發(fā)/千里馬android framwork開發(fā)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

hi,粉絲朋友們!
上一節(jié)已經(jīng)對車載的多屏互動進行了相關(guān)的技術(shù)方案介紹,以及相關(guān)的核心方法
moveRootTaskToDisplay的講解和使用。
具體可以參考鏈接:https://blog.csdn.net/learnframework/article/details/130461689
本節(jié)就來進行代碼實戰(zhàn)

1、方案設(shè)計

要實現(xiàn)雙屏互動,主要就只需要兩個步驟:
1、手指動作識別
2、識別動作后觸發(fā)尋找display,獲取頂部task,觸發(fā)moveTask操作
android 多屏方案,wms,android,java,開發(fā)語言

2、手勢動作識別部分

觸發(fā)手勢設(shè)計:因為模擬器實現(xiàn)條件有限,所以這里采用是雙指向右移動一定距離觸發(fā)。
首先要進行對手指全局移動的監(jiān)聽,針對多個手指的觸摸移動動作要進行識別。
代碼實現(xiàn):
單獨建立一個PointerEventListener的實現(xiàn)子類叫做DoubleScreenMovePointerEventListener,在這里面的onPointerEvent方法即可以實現(xiàn)對應(yīng)的觸摸動作識別,這里實現(xiàn)是雙指同時滑動觸摸方式:

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;//動作觸發(fā)閾值,最少移動為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) { //識別了雙指動作達到觸發(fā)task移動條件,則調(diào)用對應(yīng)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注冊監(jiān)聽:

@@ -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方便調(diào)用
+        mDoubleScreenMoveListener = new DoubleScreenMovePointerEventListener(mWmService, this);
         registerPointerEventListener(mTapDetector);
+        registerPointerEventListener(mDoubleScreenMoveListener);
         registerPointerEventListener(mWmService.mMousePositionTracker);
         if (mWmService.mAtmService.getRecentTasks() != null) {
             registerPointerEventListener(

3、尋找當前Display的Task,移動到目標display
觸摸動作識別后會調(diào)用DisplayContent的doTestMoveTaskToOtherDisplay方法來完成剩下的業(yè)務(wù):
1、獲取要移動到的目標display對象
2、獲取當前display要移動的Task對象
3、調(diào)用RootWindowContainer的moveRootTaskToDisplay方法來實現(xiàn)

+//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,開發(fā)語言

模擬器調(diào)試要點:

這個部分請關(guān)注bibili的 視頻
https://www.bilibili.com/video/BV1Tv4y1J7eb文章來源地址http://www.zghlxwxcb.cn/news/detail-703401.html

到了這里,關(guān)于第二節(jié)-安卓多屏雙屏實戰(zhàn)車載車機智能駕駛艙開發(fā)/千里馬android framwork開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用Android自帶模擬器模擬車載多屏顯示

    使用Android自帶模擬器模擬車載多屏顯示

    由于車機設(shè)備資源不夠,可采用 Android Studio 自帶模擬器來模擬車機多屏顯示,如下圖所示模擬一個Activity在不同屏幕顯示 更新Android Studio: 配置AVD參數(shù) Android SDK:12 開啟第二塊屏幕 按如下截圖4個步驟,設(shè)置Second Display的分辨率和屏幕密度 查看當前屏幕ID信息,用下面adb命令

    2024年02月16日
    瀏覽(74)
  • 安卓11雙屏雙背光修改方法

    安卓11上調(diào)雙屏異顯功能,系統(tǒng)驅(qū)動默認支持雙背光功能,老一點的系統(tǒng)不支持雙背光驅(qū)動,所以老版本的雙屏異顯都是同時控制2個屏的背光,客戶也沒做特別要求,新版本客戶有這個需求了,所以就想辦法去實現(xiàn);底層已經(jīng)出現(xiàn)了2個背光節(jié)點,但是上層就沒有做這個功能,

    2024年02月04日
    瀏覽(21)
  • 云計算實戰(zhàn)應(yīng)用案例精講-【自動駕駛】多模態(tài)融合智能檢測方法及 SLAM 車載實現(xiàn)(論文篇)

    目錄 基于多模態(tài)融合的人機協(xié)同模型與算法研究 感知與識別技術(shù) 2.1 手勢信息的感知與識別

    2024年02月11日
    瀏覽(22)
  • 第二章(第二節(jié)):無窮小量和函數(shù)

    若 lim f(x) = 0 , 則稱函數(shù) f(x) 當 x → x 0 時是無窮小量,簡稱: 無窮小 。 ???? x→ x 0 定理1. 有限多個 無窮小量的代數(shù)和仍是無窮小量 定理2. 有限多個 無窮小量的積也是無窮小量 定理3.常數(shù)與無窮小量的積也是無窮小量 定理4.有界變量與無窮小量的積是無窮小量 當 x→

    2024年02月08日
    瀏覽(39)
  • 計算機網(wǎng)絡(luò) 第二節(jié)

    計算機網(wǎng)絡(luò) 第二節(jié)

    目錄 一,計算機網(wǎng)絡(luò)的分類 1.按照覆蓋范圍分 2.按照所屬用途分 二,計算機網(wǎng)絡(luò)邏輯組成部分 1.核心部分 (通信子網(wǎng)) 1.1電路交換 1.2 分組交換 兩種方式的特點? ? ?重點 2.邊緣部分? (資源子網(wǎng)) 進程通信的方式: 三,計算機網(wǎng)路性能指標 1.速度指標 2.時間指標 3.往返

    2024年02月10日
    瀏覽(25)
  • 第二節(jié) LwIP簡介

    第二節(jié) LwIP簡介

    本專欄使用的是LwIP 2.1.2版本 ,官方下載鏈接:http://savannah.nongnu.org/projects/lwip/。 本專欄以LwIP 2. 1.2 為主要對象進行講解,后續(xù)中出現(xiàn)的LwIP 如果沒有特殊聲明,均指2.1.2 版本。此時的LwIP 2. 1.2 為最新版本,可能當這本書寫完的時候,LwIP 又被更新了,對于學習而言,大家其實

    2024年02月03日
    瀏覽(21)
  • 第二節(jié) LVGL移植

    第二節(jié) LVGL移植

    確定輸入、輸出設(shè)備 輸入:觸摸屏、鼠標、鍵盤以及編碼器;輸出:顯示屏 準備LVGL庫、例程 準備V8.2版本的LVGL庫文件,還有支持所需功能的例程源碼 添加LVGL庫到工程 按需裁剪、修改LVGL庫文件,并添加到MDK工程中 配置輸入、輸出設(shè)備 適配自己的輸入和輸出設(shè)備,添加所需

    2024年02月06日
    瀏覽(23)
  • 華為HCIP第二節(jié)-------------------------ISIS

    華為HCIP第二節(jié)-------------------------ISIS

    IS-IS(Intermediate System to Intermediate System,中間系統(tǒng)到中間系統(tǒng))是ISO (International Organization for Standardization,國際標準化組織)為它的CLNP(ConnectionLessNetwork Protocol,無連接網(wǎng)絡(luò)協(xié)議)設(shè)計的一種動態(tài)路由協(xié)議。 is-is是一個鏈路狀態(tài)協(xié)議。 NET相當于ospf中routeid+區(qū)域ID NET(Networ

    2024年02月15日
    瀏覽(20)
  • Datawhale 學習git-第二節(jié)

    2.3 查看提交歷史 -git log 簡單查看提交歷史 使用 git log 不帶任何參數(shù),會按時間先后順序列出所有提交,最新的排在最上面。 默認顯示的信息包括提交的哈希值、作者信息、日期和提交信息。 查看詳細的提交差異 使用 git log -p 或 git log --patch 查看每次提交的詳細差異(補丁

    2024年02月19日
    瀏覽(19)
  • C++學習——第二節(jié)課-輸入輸出

    C++學習——第二節(jié)課-輸入輸出

    大家好,我是涵子。今天我們來學習C++中的輸入輸出。 目錄 一、電腦中的輸入輸出 二、C++中的輸入輸出 2.1.輸入并輸出 2.2.cin的用法 2.3.多個輸入 ?三、變量 3.1.聲明 3.2.賦值 四、總結(jié) 日常生活中常見的電腦、手機、電視機外部接口,也就是I/O(輸入/輸出)接口部分,其樣式

    2024年02月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包