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的,刚好我 ...
随机推荐
- SQL Server中查找包含某个文本的存储过程
SELECT name,text from sysobjects o,syscomments s where o.id=s.id and text LIKE '%text%' and o.xtype= ...
- Python中按值来获取指定的键
转自: https://blog.csdn.net/Jerry_1126/article/details/87907162 Python字典中的键是唯一的,但不同的键可以对应同样的值,比如说uid,可 ...
- android studio 汉化
the modules below are not imported from Gradle anymore. Check those to be removed from the ide proje ...
- pojA Star not a Tree?
题目链接 pojA Star not a Tree? 题解 啊,模拟退火是个好东西 模拟退火即可 代码 #include<cmath> #include<cstdio> #in ...
- [BZOJ2879][NOI2012]美食节(费用流)
设sm为所有p之和,套路地对每道菜建一个点,将每个厨师拆成sm个点,做的倒数第i道菜的代价为time*i. S向每道菜连边<0,p[i]>(前者为代价后者为流量),i菜到j厨师的第k个点连 ...
- Java并发程序设计(七)乐天派:无锁
无锁 一.概述 无锁是处理并发的一种乐观策略,它会假设对资源的访问是没有冲突的.既然没有冲突自然不需要等待,所以所有的线程都可以在不停顿的状态下执行.那遇到冲突怎么办?接下来请看,无锁绝招“CAS”即 ...
- Python常见下划线
python中常见的下划线意义 Python中常常使用下划线里对变量进行修饰,通常作为变量的前缀或者后缀出现,被修饰的变量一般存在特殊的用法: _XXX:不能被from module import _ ...
- 滑动CheckBox样式
<Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}"> <Setter P ...
- 用面向对象计算BMI指数
from __future__ import division class Student: def __init__(self,name,weight,height): self.name=name ...
- android View的点击无效的原因
点击事件不生效,原来是因为我在里面的 ImageView中添加了 android:clickable="true". 解决办法:删掉ImageView中的android:click ...