Android Launcher分析和修改8——AllAPP界面拖拽元素(PagedViewWithDraggableItems)
接着上一篇文章,继续分析AllAPP列表界面。上一篇文章分析了所有应用列表的界面构成以及如何通过配置文件修改属性。今天主要是分析PagedViewWithDraggableItems类,因为在我们分析AppsCustomizePagedView之前,需要先了解PagedViewWithDraggableItems。这是因为他们是继承关系。我们先看看AppsCustomizePagedView的类继承关系。(以后博客的图片都会加上水印,因为发现很多转载文章的人把所有作者信息都删除了,鄙视这种行为 ╭∩╮(︶︿︶)╭∩╮)
1、触摸拦截
从上面的类关系图我们可以看到,我们今天需要分析的PagedViewWithDraggableItems类是继承了PagedView类。PagedView我在第六篇文章里面已经做了详细分析。PagedView里面主要就是实现了界面滑动操作,PagedView把页面滑动的消息在onInterceptTouchEvent()里面拦截了,然后在onTouchEvent()里面进行滑动页面的处理。既然PagedViewWithDraggableItems也是继承PagedView,我们先看看PagedViewWithDraggableItems有关触摸事件的拦截和处理。
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
if(OWL_DEBUG) Log.d(OWL, "enter- onInterceptTouchEvent ");
handleTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent ev)
{
if(OWL_DEBUG) Log.d(OWL, "enter- onTouchEvent ");
handleTouchEvent(ev);
return super.onTouchEvent(ev);
}
PagedViewWithDraggableItems的onInterceptTouchEvent和onTouchEvent处理都很简单,而且都调用了同一个处理方法。调用完handleTouchEvent(ev)方法后,会直接调用父类的相对应接口。父类的接口也就是PagedView的接口,这两个拦截触摸消息的回调方法,我们在上一篇文章已经做了很详细分析,这里不再多说。根据代码执行顺序,我们可以知道,界面会先调用PagedViewWithDraggableItems的onInterceptTouchEvent方法并且做了一些额外处理,然后才会调用PagedView的处理。下面我们看看PagedViewWithDraggableItems的handleTouchEvent方法做了什么事。
2、handleTouchEvent方法
//Edited by mythou
//http://www.cnblogs.com/mythou/
private void handleTouchEvent(MotionEvent ev)
{
final int action = ev.getAction();
if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent action="+(action & MotionEvent.ACTION_MASK)+
" mTouchState="+mTouchState+" mIsDragging="+mIsDragging+" mIsDragEnabled="+mIsDragEnabled);
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN: //按下事件处理
cancelDragging();
mIsDragEnabled = true;
break;
case MotionEvent.ACTION_MOVE: //进入滑动状态
if (mTouchState != TOUCH_STATE_SCROLLING && !mIsDragging && mIsDragEnabled)
{
//根据是否进入滚动状态,判断是否需要拖曳按钮
if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent--->before drag ");
determineDraggingStart(ev);
}
else
{
if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent--->Not drag ");
}
break;
}
}
从上面代码我们可以看到handleTouchEvent里面判断了两种触摸状态:ACTION_DOWN和ACTION_MOVE。在ACTION_DOWN的时候会清理有关拖动图标的标记。而在ACTION_MOVE的时候,会根据当前TouchState是不是滚动状态,如果不是,进入拖动图标操作。TouchState是根据PagedView里面的状态判断的,这个我们分析TouchState的时候已经分析过。下面我们看看代码调用流程,下面是我加了打印消息后,LogCat的消息:
上面是我结合PagedView类和PagedViewWithDraggableItems类对一次界面滑动的代码跟踪 ,我们可以看到系统先调用PagedViewWithDraggableItems的onInterceptTouchEvent然后依次调用上面分析的代码。需要注意的是上面LogCat高亮喊信息里面,会跑到handleTouchEvent的ACTION_MOVE,然后调用determineDraggingStart()方法。不过这里并不会调用PagedViewWithDraggableItems的determineDraggingStart()方法,而且调用了AppsCustomizedPagedView的方法,因为在AppsCustomizedPagedView里面把这个方法重写了。是一个空方法。
4、拖曳按钮
上面分析的流程是滑动界面执行的代码流程,下面我们看看如果你需要拖曳一个按钮,会怎么样。Android里面拖曳一个按钮,首先需要除非LongClick消息,也就是需要长按按钮才行。下面我们跟踪LogCat消息看看代码运行情况:
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override
public boolean onLongClick(View v)
{
if(OWL_DEBUG) Log.d(OWL, "onLongClick Enter"); //下面有几种情况会取消长按触摸,不是触摸状态,正在动画过渡,离开了allAPP页面
if (!v.isInTouchMode()) return false;
// Return early if we are still animating the pages
if (mNextPage != INVALID_PAGE) return false;
// When we have exited all apps or are in transition, disregard long clicks
if (!mLauncher.isAllAppsCustomizeOpen() ||
mLauncher.getWorkspace().isSwitchingState()) return false; if(OWL_DEBUG) Log.d(OWL, "onLongClick beginDragging()");
//调用开始拖曳的设置,里面会设置一些标记
return beginDragging(v);
}
PagedViewWithDraggableItems的onLongClick()方法,只是执行了简单的标记设置。到这里应该可以了解PagedViewWithDraggableItems主要的作用,因为Launcher里面很大一部分功能就是对于这种手势操作的处理,所以有必要认真分析这几个基类。为后面分析AppsCustomizedPagedView打好基础。
Launcher分析系列文章:
Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)
Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
Android Launcher分析和修改3——Launcher启动和初始化
Android Launcher分析和修改4——初始化加载数据
Android Launcher分析和修改5——HotSeat分析
Android Launcher分析和修改6——页面滑动(PagedView)
Android Launcher分析和修改7——AllApp全部应用列表(AppsCustomizeTabHost)
Edited by mythou
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3183081.html
Android Launcher分析和修改8——AllAPP界面拖拽元素(PagedViewWithDraggableItems)的更多相关文章
- Android Launcher分析和修改7——AllApp全部应用列表(AppsCustomizeTabHost)
今天主要是分析一下Launcher里面的所有应用列表.Android4.0 Launcher的所有应用列表跟2.X比较大的区别就是多了Widget的显示.下面会详细分析Launcher里面有关所有应用 ...
- Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换
已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...
- Android Launcher分析和修改9——Launcher启动APP流程
本来想分析AppsCustomizePagedView类,不过今天突然接到一个临时任务.客户反馈说机器界面的图标很难点击启动程序,经常点击了没有反应,Boss说要优先解决这问题.没办法,只能看看是怎么 ...
- Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- Android Launcher分析和修改11——自定义分页指示器(paged_view_indicator)
Android4.0的Launcher自带了一个简单的分页指示器,就是Hotseat上面那个线段,这个本质上是一个ImageView利用.9.png图片做,效果实在是不太美观,用测试人员的话,太丑了. ...
- Android Launcher分析和修改12——Widget列表信息收集
很久没写Launcher分析的文章,最近实在太忙.今天七夕本来是想陪女朋友逛街 ,碰巧打台风呆在家里,就继续写一篇文章.今天主要是讲一下Launcher里面的Widget列表,这方面信息比较多,今天重 ...
- Android Launcher分析和修改3——Launcher启动和初始化
前面两篇文章都是写有关Launcher配置文件的修改,代码方面涉及不多,今天开始进入Launcher代码分析. 我们开机启动Launcher,Launcher是由Activity Manager启动的 ...
- Android Launcher分析和修改4——初始化加载数据
上面一篇文章说了Launcher是如何被启动的,Launcher启动的过程主要是加载界面数据然后显示出来, 界面数据都是系统APP有关的数据,都是从Launcher的数据库读取,下面我们详细分析Lau ...
- Android Launcher分析和修改5——HotSeat分析
今天主要是分析一下Launcher里面的快捷方式导航条——HotSeat,一般我们使用手机底下都会有这个导航条,但是如果4.0的Launcher放到平板电脑里面运行,默认是没有HotSeat的,刚好我 ...
随机推荐
- 利用zabbix监控oracle数据库
一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需要跟我的环境一 ...
- racket 学习笔记
length: (define (my-length lst) (if (empty? lst) 0 (+ (my-length (rest lst)) 1))) map: (define (my-m ...
- 一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 一个新的Android Studio 2.3 ...
- [TYVJ1473]校门外的树3
思路: 维护两个树状数组,一个记录种树区间左端点,一个记录右端点. 每次询问查询“看不见的树区间”,即右端点小于查询区间左端点和左端点小于查询区间右端点. #include<cstdio> ...
- java中哪些数值不能被初始化
main方法中的变量不能被初始化 final修饰的变量不能被初始化·
- 响应式 Web 设计指南「基础篇」
Web 是普遍存在的,也是无处不在的,Web可以适应任何尺寸的屏幕以及任何使用环境,因为Web有其固有的灵活性和可塑性. Web 再也不是某一平台独有的矿藏,而是真正成为了一张名副其实的大网,并将各种 ...
- webpack总结
1.webpack默认只能引用js文件,通过loader可以引入别的文件(css.image.font等) 2.webpack-dev-server提供了一个web server,通过配置将dist目 ...
- 版本视图找不到数据 EDITIONING VIEW
Oracle database 12 以后的版本,特别在EBS R12.2.X加入了版本视图这种技术,跟MOAC有点像. CREATE OR REPLACE FORCE EDITIONING VIEW ...
- 深入理解 Java try-with-resource 语法糖
背景 众所周知,所有被打开的系统资源,比如流.文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故. 在Java的江湖中,存在着一种名为fina ...
- 回顾2018年最受欢迎的十四款NoSQL产品
虽然NoSQL的流行与火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动.尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟.稳定.不过现在也面临着一个严酷的事实:技术越 ...