奇迹sf 说说Android桌面(Launcher应用)背后的故事(八)??让桌面的精灵穿越起来 - Liner-J - 博客频道 - CS

个人认为读书,一定要全神贯注,越集中精神越容易理解书上的东西,也就会越看越快,我读书属于慢热型的(好像所有读书都是慢热型吧?),就像一个线性函数一样,刚开始是0,慢慢就会越来越快,前提是一定要集中精神,就是常说的进入书里面。当有速度达到一定程度的时候,不要停下来,坚持,每次都可以挑战自己读书的速度与质量。这样能够每次提高集中精神的速度与读书质量。

有了这个基本的了解,再进入代码中寻求更细的答案就不再费事了。下面,就让我们继续实现我们未完成的功能:


我们知道,前面的部分,所有的动作都是始于用户长按桌面某个空白的区域,那么当用户长按的是桌面上的某个item,我们要处理什么呢?对,就是拖拽了。所以,在Launcher中的onLongClick事件中,我们要加入长按某个item的处理。完整的onLongClick方法如下:

其中,scollAction就是一个线程,由它来完成从一个屏幕滑动到另一个屏幕。这里需要注意的是:你所看到的滑动到下一个屏幕,其实,不是你在拖拽着item滑动到下一个屏幕的,而是,下一个屏幕滑动到当前手机窗口下的。所以,这个逻辑,不是应该由DragLayer来实现,而是由Workspace来实现。所以,Workspace实现了DragScroller接口,负责处理item滑动到下一个屏幕的逻辑。其中scrollAction对应的线程类代码如下:


前面都只是拖拽的准备工作,接下来就要看看拖拽是如何实现的了,那么经过前面系列文章的分析,到这里,你应该有一个自然而然的直觉:到onTouchEvent中去寻找答案。呵呵,因为要处理拖拽,无非就是处理MOTION_MOVE等事件。在这里,处理了移动区域的重新绘制,以及判断当前item所在的位置是否为屏幕的边缘20dip以内,如果是的话,则需要将其移动到下一个屏幕。同时,也需要判断当前item所在的位置是否是删除区域,如果是删除区域的话则将绘制Bitmap的画笔加一个变色蒙版,也就是我们看到当我们拖拽item经过垃圾箱区域的时候,被捉拽的item就变成红色了。下面,看看该方法的完整逻辑:

感觉看书一直找不到技巧,尤其对某些基础教程java,javascript之类的书籍,似乎看完就忘,就像一次旅行,然后全部忘掉一样(也许零零散散的能剩点?)。


到了这里,长按桌面某个item,item放大的原理想必就一目了然了。那么其,从原始大小向放大后的Bitmap是如何过渡的呢?这个,就让我们再到dispatchDraw中一探究竟。在这个方法中,处理了这个过渡的动画效果,其实,就是设定一个动画时间,然后在这么长时间内才从原始大小渐变到放大后的大小。完整代码如下:

有的人读书不能集中注意力,起初我也是读书总是不能集中注意力,不过有一个办法可以解决这种问题,办法就是要快,不要长时间停留在一个地方,快就能使注意力集中,注意力集中就能带动速度,也就是良性循环。

到大学后才开始慢慢的读书,但是都是些小说或其他非技术书籍(这里推荐一本小说《追风筝的人》)。

上面的代码中在MOVE事件中进行了移动过程的处理。代码中,应该看到了,当item被拖到边缘20dip以内的位置,其执行的逻辑是:

不知道是因为搞软件的原因还是其他不明原因,总是把自己想成CPU,因为有的时候思绪来的很快,走的也很快,所以当一个想法闪过的时候总是想快速的实现。尤其读书的时候这种想法来的最多、变换的也最快、乱七八糟各个方面的想法,这就像头脑风暴一样,如果把这些联想到的东西全部凑在一块,那就是一个创意。所以读书不只要快,还要学会快速的切换,就像CPU一样,快速的切换时间片一样, 就是CPU的并行。 一般我读书遇到一个问题,这个问题的深入介绍可能在网上,打开IE搜索(这个期间要等几秒钟的, 尤其网速慢就更长), 这个时间接着回去看书,长期这种习惯就能让自己快速的切换场景、快速进入一个主题当中去学习, 还可以快速的恢复到原来的读书场景当中。 这种学习方法,如果看了思维导图之后应该能有更深刻的理解(据说美国波音飞机的设计草图, 就是工程师用思维导图的方式密密麻麻的画了很大很大一张纸上)。

大概半年前吧就开始看技术书籍,刚开始主要看这些基础教程,属java基础教程看的较多吧。

如果你对其中的一些关于拖拽的细节还不是很清楚,那么你可以看看前面两篇关于拖拽的文章,它们可以帮你很好的理解拖拽的细节性问题。



系统Launcher为了实现item的拖拽,可谓下了很大的功夫,面面俱到。为了实现拖拽的功能,其定义了一组比较抽象的概念:拖拽源(DragSource);拖拽目的地(DragTarget);拖拽控制器(DragController);和拖拽界面(DragLayer)。DragSource主要用来表示桌面上的item可以从哪些位置被拖动,这里的“哪些位置”就是用DragSource来标识。比如,系统Launcher中的Workspace,AllAppsGridView,Folder都是DragSource,也就是在这些位置里的item可以被拖拽。DragTarget则对应的,表示可以容纳一个item的位置。比如,系统Launcher中的Workspace,Folder,DeleteZone就是DragTarget,也就是我们可以拖着某个item在这些位置上放下,item就被移到这个位置了。同时,为了处理多个桌面之间的拖动,其定义了一个DragScroller来负责处理多个桌面之间拖动的时候的逻辑。一个item在桌面上的生命周期有来,魔域私服,自然也得有去的时候,拖拽的时候,桌面下方的某块区域固定为删除区域(DeleteZone),这样,当被拖拽的item在这个区域内被释放的时候,就意味着其在桌面上生命的结束。


在这个方法中,只是做了一些辅助的处理,奇迹sf,真正实现拖拽的是DragController接口的实现者。那么,到这里,就自然的追溯到Workspace布局控件的父控件DragLayer控件了。接下来,就让我们进入DragLayer中一探item移动的秘密:

有了前面的工作,基本上这个桌面就已经像模像样了,但是,和系统自带的Launcher相比,还差得很远。其中,系统Launcher的桌面上的item是可以任意穿越(移动)的。同时,在其穿越的过程中,你也可以将其kill掉。在这篇文章中,就让我们来看看桌面上的精灵如何实现她们穿越的梦想….


看书不要挑时候,如果身边有书、想看、那就立马翻开书看,床边、电脑边、站着、等人的时候、厕所。 我自己家倒喜欢床边,在屋里站着或靠着墙看,厕所也是一大爱好。

在这个方法中当判断当前用户长按的是一个item的时候,执行mWorkspace.startDrag(cellInfo);所以,我们进入这个方法中看看其处理逻辑:

其根据在ACTION_MOVE中计算的位置和方向来判断其滑动到下一个屏幕的方向。上面说了,眼前的滑动行为是下一个屏幕显示到了当前手机的窗口下,而不是当前的item真的被你拖到下一个屏幕的。所以,我们需要找到DragScroller的实现者:Workspace。在Workspace中,其执行了scrollLeft和scrollRight的逻辑:

到这里,完整的item拖拽过程就介绍完毕了。我们的桌面也越来越接近系统Launcher了。但是,我们现在只支持向桌面添加Application和Shortcut,是只占据一个单元格的最简单的item了。还无法向桌面添加各式各样的Widget以及文件夹等功能。但是不要心急,什么事情都有个先后顺序,都是从简单到复杂的。

回想小学、初中、高中, 这些学习生涯当中似乎真的没怎么读过什么书,更别说课外的技术书籍了。

下一篇我们就要介绍如何让我们的桌面也支持各种Widget(小部件)。

所以,结论就是:读书一定要快、注意力集中,提高自己阅读质量。

上面的代码很简单,就是判断了其是否在删除区域内,如果不是调用mWorkspace.moveShortcutOnDesk(mOriginator, cellInfo);方法来完成位置的移动。那么,我们来看看这个方法,这个方法中的逻辑就是分两种情况,如果是在同一个屏幕中移动,则直接根据新的位置重新绘制就可以了,但是如果移动前和移动后不在同一个屏幕,则需要将原来的屏幕上的给删掉,在新的屏幕上添加。代码如下:


由于DragLayer实现了DragController接口,所以,我们先从刚刚中断的地方开始,先来看看startDrag中的逻辑,在这个方法里,屏蔽了输入法,创建了移动的Bitmap,同时,放大了一定的倍数,并设置了相关的动画参数。完整的代码如下:

我们学习的过程中,肯定会遇到很多问题,不懂的名词,所以学会快速的切换场景,我觉得还是很重要的。比如原本只想弄清楚,java是什么,java解释一文中还有更多的RMI、JNI、JNDI、JPA像这类你不懂的东西,为了弄清楚第一个问题, 我们有的时候不得不去弄清楚这些名词。

想必您还记得前面在Workspace分析的时候,其中的snapToScreen方法,不记得的话,可以到那里去寻找答案。好了,现在这个拖动的过程就这么实现了。那么,当我们停止拖拽释放了item,其又是如何被添加到新的位置或者被删除的呢?这个看上面ACTION_UP中的部分,调用了stopDrag方法。那么我们看看这个方法的逻辑。其实,这里很简单了,就是判断当前位置是否是删除区域,如果是执行删除逻辑,如果不是,则执行移动位置逻辑。代码如下:



上一篇: 传奇世界私服 2007版最土的23件事
下一篇:下面没有链接了