Android4,flutter插件引用第三方库
Workspace的beginDragShared方法
從上文中可以發(fā)現,只要是在Workspace上啟動物體的拖拽,最終都會走到Workspace.beginDragShared方法里。在這個方法中,首先會通過createDragBitmap繪制用于拖拽的圖形(包括在原圖外層繪制一圈紅色邊界),然后計算位置與邊界,并將其傳給DragController管理。
從AppsCustomizePagedView中選擇一個應用或Widget放置到Workspace上
AppsCustomizePagedView繼承自PagedViewWithDraggableItems,即我們平時所說的應用程序抽屜。當長按應用圖標或widget時,AppsCustomizePagedView會隱藏,顯示Workspace的縮小狀態(tài),即SPRING_LOADED。
在源碼中,該狀態(tài)轉換有三個入口,均在PagedViewWithDraggableItems中給出,即onInterceptTouchEvent、onTouchEvent與onLongClick。最終都轉到AppsCustomizePagedView的b
《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰(zhàn)源碼講義》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整內容開源分享
eginDragging方法。但筆者試了多次,發(fā)現只有onLongClick被調用。
AppsCustomizePagedView的beginDragging
beginDragging類似一個代理方法,首先進行Launcher狀態(tài)的轉換,然后會根據被拖拽物的不同,調用不同的拖拽方法。
應用程序的拖拽beginDraggingApplication
對于應用程序來說,從抽屜拖拽到桌面,界面的隱藏在beginDragging中都已經處理好了,AppsCustomizePagedView不需要保存任何有關被拖拽應用的信息(就算取消拖拽,也只需要重新顯示AppsCustomizePagedView就行了,不像Folder那樣還需要恢復快捷方式)。因此,只需要通知Workspace繪制圖標邊界,然后啟動拖拽即可。
Widget/快捷方式的拖拽beginDraggingWidget
對于Widget列表中的元素,由于有可能為快捷方式,因此還需要進行判斷。對不同類型的拖拽物,用不同的方式繪制圖形及圖標邊界。
DragController
==============
startDrag開始拖拽
從上文可以發(fā)現,無論是以何種方式進入拖拽,最終都是調用DragController的startDrag方法進行處理。
在DragController中,startDrag是個多態(tài)方法,但最終,都走到了以下這個實現中。
Java代碼??
public?void?startDrag(Bitmap?b,?int?dragLayerX,?int?dragLayerY,
DragSource?source,?Object?dragInfo,?int?dragAction,
Point?dragOffset,?Rect?dragRegion)
startDrag的邏輯比較清晰,主要是通知相應的監(jiān)聽器拖拽開始,然后創(chuàng)建拖拽對象及其視圖,將其移動到當前觸摸到位置。
觸屏事件的攔截
onInterceptTouchEvent
DragLayer繼承自ViewGroup,其onInterceptTouchEvent方法若返回true,說明需要攔截觸屏事件,則后續(xù)的一系列事件將傳遞給自身的onTouchEvent方法,而不再向其子控件傳遞。
DragController的onInterceptTouchEvent由DragLayer的onInterceptTouchEvent調用,用于攔截觸屏事件的處理。當用戶點擊屏幕時,觸發(fā)ACTION_DOWN事件,記錄當前觸摸位置。當抬起時,觸發(fā)ACTION_UP事件,結束拖拽。若抬起時處于拖拽中,在當前位置釋放被拖拽物(在筆者測試過程中未檢測到其調用)。最后,返回是否處于拖拽狀態(tài)。
因此,若此時處于拖拽中,后續(xù)的觸屏事件將只傳遞到DragLayer的onTouchEvent。
onTouchEvent
onTouchEvent由于處理觸屏事件,若返回true,則表示消費掉該事件,事件不再向父控件的onTouchEvent傳遞。
DragController的onTouchEvent由DragLayer的onTouchEvent調用,用于處理被拖拽物的移動。
當startDrag執(zhí)行完畢,DragController設置拖拽狀態(tài)為true,這樣,觸屏事件將最終轉到onTouchEvent中,在此處調用handleMoveEvent進行物體的移動。其基本流程如下。
handleMoveEvent進行移動
handleMoveEvent是拖拽的主要方法,當用戶觸發(fā)拖拽后,DragController將通過該方法移動被拖拽物視圖,并通知各個釋放目的對象相應狀態(tài)的改變。若進入滑屏區(qū)域且允許滑屏,執(zhí)行相應的滑屏操作。如下圖所示。
drop釋放被拖拽物到當前位置
改變。若進入滑屏區(qū)域且允許滑屏,執(zhí)行相應的滑屏操作。如下圖所示。
[外鏈圖片轉存中…(img-KumvFWdp-1637897879843)]
drop釋放被拖拽物到當前位置
總結
以上是生活随笔為你收集整理的Android4,flutter插件引用第三方库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之递归神经网络(Recurren
- 下一篇: ssh 免密_Linux下配置SSH免密