`
haliluya4
  • 浏览: 123461 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Android4.0 Launcher拖拽原理分析(一)

阅读更多

Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的。

基本流程是相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象、当前位置、拖拽源、待拖拽对象等信息传给DragControllerstartDrag方法启动拖拽。接下来,DragLayeronInterceptTouchEvent拦截触屏事件,将其转到DragControlleronTouchEvent方法。在DragControlleronTouchEvent中调用DragControllerhandleMoveEvent进行对象的移动,并通知相应拖拽目的对象状态的改变。最后在DragControlleronTouchEvent中检测到抬起事件时调用drop方法释放待拖拽对象,调用endDrag方法结束拖拽。

拖拽开始

Launcher中,拖拽有两种方式触发:1、在Workspace上进行拖拽;2、从AppsCustomizePagedView中选择一个应用或Widget放置到Workspace上。

Workspace上进行拖拽

长按某个图标或Widget

在这种情况下,会调用LauncheronLongClick方法,进而对于非文件夹调用WorkspacestartDrag方法来隐藏相应视图并绘制图标边界(在Workspace上显示的用于标识当前拖拽图标所处位置的蓝色边界图形),最终转到Workspace.beginDragShared方法。


 
 

在打开的文件夹中长按某个图标

Launcher中,对于文件夹中元素的长按,是在FolderonLongClick里处理的,故长按某个图标或Widget中,对于文件夹,则直接返回。

若允许拖拽,则调用WorkspacebeginDragShared进行处理。


 

WorkspacebeginDragShared方法

从上文中可以发现,只要是在Workspace上启动物体的拖拽,最终都会走到Workspace.beginDragShared方法里。在这个方法中,首先会通过createDragBitmap绘制用于拖拽的图形(包括在原图外层绘制一圈红色边界),然后计算位置与边界,并将其传给DragController管理。


 

AppsCustomizePagedView中选择一个应用或Widget放置到Workspace

AppsCustomizePagedView继承自PagedViewWithDraggableItems,即我们平时所说的应用程序抽屉。当长按应用图标或widget时,AppsCustomizePagedView会隐藏,显示Workspace的缩小状态,即SPRING_LOADED

在源码中,该状态转换有三个入口,均在PagedViewWithDraggableItems中给出,即onInterceptTouchEventonTouchEventonLongClick。最终都转到AppsCustomizePagedViewbeginDragging方法。但笔者试了多次,发现只有onLongClick被调用。


 

AppsCustomizePagedViewbeginDragging

beginDragging类似一个代理方法,首先进行Launcher状态的转换,然后会根据被拖拽物的不同,调用不同的拖拽方法。


 
 

应用程序的拖拽beginDraggingApplication

对于应用程序来说,从抽屉拖拽到桌面,界面的隐藏在beginDragging中都已经处理好了,AppsCustomizePagedView不需要保存任何有关被拖拽应用的信息(就算取消拖拽,也只需要重新显示AppsCustomizePagedView就行了,不像Folder那样还需要恢复快捷方式)。因此,只需要通知Workspace绘制图标边界,然后启动拖拽即可。


 

Widget/快捷方式的拖拽beginDraggingWidget

对于Widget列表中的元素,由于有可能为快捷方式,因此还需要进行判断。对不同类型的拖拽物,用不同的方式绘制图形及图标边界。


 

DragController

startDrag开始拖拽

从上文可以发现,无论是以何种方式进入拖拽,最终都是调用DragControllerstartDrag方法进行处理。

DragController中,startDrag是个多态方法,但最终,都走到了以下这个实现中。

public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
 DragSource source, Object dragInfo, int dragAction,
 Point dragOffset, Rect dragRegion)

startDrag的逻辑比较清晰,主要是通知相应的监听器拖拽开始,然后创建拖拽对象及其视图,将其移动到当前触摸到位置。


 

触屏事件的拦截

onInterceptTouchEvent

DragLayer继承自ViewGroup,其onInterceptTouchEvent方法若返回true,说明需要拦截触屏事件,则后续的一系列事件将传递给自身的onTouchEvent方法,而不再向其子控件传递。

DragControlleronInterceptTouchEventDragLayeronInterceptTouchEvent调用,用于拦截触屏事件的处理。当用户点击屏幕时,触发ACTION_DOWN事件,记录当前触摸位置。当抬起时,触发ACTION_UP事件,结束拖拽。若抬起时处于拖拽中,在当前位置释放被拖拽物(在笔者测试过程中未检测到其调用)。最后,返回是否处于拖拽状态

因此,若此时处于拖拽中,后续的触屏事件将只传递到DragLayeronTouchEvent

onTouchEvent

onTouchEvent由于处理触屏事件,若返回true,则表示消费掉该事件,事件不再向父控件的onTouchEvent传递。

DragControlleronTouchEventDragLayeronTouchEvent调用,用于处理被拖拽物的移动。

startDrag执行完毕,DragController设置拖拽状态为true,这样,触屏事件将最终转到onTouchEvent中,在此处调用handleMoveEvent进行物体的移动。其基本流程如下。


 

handleMoveEvent进行移动

handleMoveEvent是拖拽的主要方法,当用户触发拖拽后,DragController将通过该方法移动被拖拽物视图,并通知各个释放目的对象相应状态的改变。若进入滑屏区域且允许滑屏,执行相应的滑屏操作。如下图所示。


 

drop释放被拖拽物到当前位置

当用户将被拖拽物移动到相应位置后,可以将手指从屏幕上移开。此时,将在onInterceptTouchEvent(未试出)与onTouchEvent中调用drop方法释放被拖拽物。

其主要功能,就是查找拖拽目的对象(DropTarget),若找到且接受释放,通知该对象被拖拽物的放入。最后,通知拖拽源(被拖拽物最初所在的容器)拖拽结果。


 

findDropTarget查找当前位置对应的拖拽目标对象

handleMoveEventdrop中,均使用了findDropTarget来查找当前位置对应的拖拽目的对象,其基本原理就是遍历所有已注册的拖拽目的对象,若其支持放入且当前位置位于该对象的触发区域内,则匹配成功返回该对象。


 

DragController拖拽控制流程总结

总的来说,DragController拖拽控制就是:1、使用startDrag进入拖拽状态;2、使用onInterceptTouchEventonTouchEvent响应用户的触屏动作;3、使用handleMoveEvent处理被拖拽物的移动;4、使用drop将被拖拽物释放到相应位置。

  • 大小: 28.2 KB
  • 大小: 13.1 KB
  • 大小: 25.7 KB
  • 大小: 26.7 KB
  • 大小: 53 KB
  • 大小: 33.5 KB
  • 大小: 15.6 KB
  • 大小: 32.1 KB
  • 大小: 6.5 KB
  • 大小: 8.8 KB
  • 大小: 21.5 KB
  • 大小: 42.1 KB
分享到:
评论

相关推荐

    android4.0 Launcher2

    总结,Android 4.0的Launcher2是一个强大且易用的启动器,它的源代码为我们揭示了Android桌面系统的工作原理。通过深入学习和理解这部分源码,开发者不仅可以了解Android系统的内部机制,还能为自己的应用开发提供...

    android 4.0 launcher分析

    本文将深入剖析Android 4.0版本的Launcher,理解其背后的运行机制和设计原理。 首先,我们需要了解Android应用程序的基本构成。一个标准的APK文件包含了四大组件:Activity(应用程序的窗口)、Service(后台运行的...

    Android 4.0 Launcher2 源码 Eclipse版

    【Android 4.0 Launcher2 源码 Eclipse版】是一个专门为Android 4.0 (Ice Cream Sandwich)系统设计的启动器源代码,适合开发者深入理解Android系统的桌面启动器工作原理,以及进行自定义开发。这个源代码版本是为...

    Android 4.0 Launcher系统源码

    Android 4.0 Launcher系统源码是Android操作系统中桌面启动器的重要组成部分,它负责管理主屏幕、应用快捷方式、小部件以及桌面布局等用户界面。深入理解这部分源码对于开发者来说,有助于定制个性化启动器或者优化...

    android4.0 launcher源码

    虽然Android 4.0不支持多窗口模式,但通过分析源码,开发者可以了解如何在后续版本中实现这一特性,例如在Android 7.0及更高版本。 总的来说,深入研究Android 4.0 Launcher的源码能帮助开发者理解Android系统的...

    android4.0 Launcher源码

    通过对Android 4.0 Launcher源码的分析,开发者可以更深入地了解Android系统的架构,提高应用开发的专业技能。无论是对于系统级别的优化,还是对个人项目的需求,都能从中受益匪浅。因此,花时间研究和理解这段源码...

    android4.0 launcher2

    "Android 4.0 Launcher2"是Android操作系统的一个核心组件,它是用户与设备交互的主界面,负责显示应用快捷方式、小部件以及桌面布局。在这个源代码中,我们可以深入理解Android系统的桌面启动器是如何实现其功能的...

    Android 4.0 Launcher2可导入eclipse中直接运行

    Android 4.0 的 Launcher2 是 Android 操作系统的一个核心组件,它是用户界面的主要部分,负责桌面、应用抽屉和快捷方式的管理。这个项目是为开发者提供的源代码,允许他们深入理解 Launcher2 的工作原理,并对其...

    android 定制 launcher 4.0源码

    通过以上步骤,你可以逐步了解和掌握Android 4.0 Launcher的定制原理。这个过程可能需要花费不少时间,但能帮助你深入理解Android系统的工作机制,为将来开发自己的Launcher或者其他系统级别的定制打下坚实的基础。

    Android 4.0 Launcher 可编译代码

    Android 4.0 Launcher 是Android操作系统的一个重要组成部分,它是用户界面的核心组件,负责管理应用程序的启动、布局和交互。在Android 4.0(Ice Cream Sandwich,简称ICS)版本中,Launcher进行了诸多改进,旨在...

    android4.0-launcher可运行源码

    当我们谈论“android4.0-launcher可运行源码”时,意味着我们可以直接在Eclipse开发环境中运行这个源代码,这为我们提供了深入理解Android 4.0 Launcher工作原理的机会。这篇内容将详述Android 4.0 Launcher的核心...

    android 4.0 Launcher2 源码

    通过深入分析 Android 4.0 Launcher2 的源码,开发者可以学习到 Android UI 设计、数据管理、事件处理、动画制作以及性能优化等多个方面的知识。这不仅有助于定制个性化桌面,也能提升对 Android 系统整体运行机制的...

    android 4.0 launcher2 源码eclipse可以编译

    本代码是4.0 launcher 源码. 支持4.0 4.1 系统. 真机运行截图见 shoot.png. 如果您遇到麻烦请自己搭建android开发环境:linux系统,虚拟机,下载android源码 等.这将花费有经验的您几天时间. 迅速获得编译技术支持(如果...

    android4.0 Launcher2 界面 源代码

    Android 4.0 的 Launcher2 是 Android 桌面启动器的一个版本,它负责呈现用户在设备上看到的主屏幕、应用抽屉和其他界面。在这个源代码包中,我们可以深入理解 Android 应用程序框架、UI 设计以及系统级别的交互逻辑...

    android4.0Launcher源码

    4.0Launcher的源码,在项目中的library文件中包含了编译所需要的framework_intermediates,android-common_intermediates,core_intermediates的jar文件,项目还整合了android.support.v13.dreams.BasicDream.java这...

    android2.3 仿 4.0 launcher

    【Android 2.3 仿 4.0 Launcher】是一个针对Android 2.3 Gingerbread系统设计的桌面启动器,其目标是模仿Android 4.0 Ice Cream Sandwich的用户界面和功能。在Android 2.3系统上使用这个启动器,用户可以获得与...

    android4.0原生launcher代码

    理解其源码对于开发者深入理解 Android 系统的工作原理、定制个性化桌面或开发自定义 Launcher 应用至关重要。本篇文章将深入探讨 Android 4.0 原生 Launcher 的主要组件、功能和实现机制。 1. **Launcher 类结构**...

    修改android 4.0 launcher 达到ios 系统 iphone桌面的效果。.zip

    修改android 4.0 launcher 达到ios 系统 iphone桌面的效果。第一版本;支持拖动排序。支持文件夹操作。 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等...

    android Launcher 4.0 (原生版本)

    Android Launcher 4.0,是Android操作系统的一个重要组成部分,它作为用户与系统交互的初始界面,扮演着桌面的角色。在Android 4.0(Ice Cream Sandwich,简称ICS)这个版本中,Launcher进行了诸多改进和优化,提升...

    Android4.0 Ice Cream Sandwich Launcher 源码

    下面我们将深入探讨Android 4.0 ICS Launcher的源码,分析其中的关键知识点。 1. **UI设计更新**:ICS引入了更加现代化的界面设计,如半透明状态栏和导航栏,以及平滑过渡效果。在源码中,你可以看到如何通过自定义...

Global site tag (gtag.js) - Google Analytics