代码改变世界

随笔档案-2012年07月

说说Android桌面(Launcher应用)背后的故事(大结局)——让Widget拥有Application同等的待遇

2012-07-30 15:07 by tang768168, 570 阅读, 收藏,
摘要: 前一篇中,演示了如何开发一个Widget以及如何开发一个WidgetHost应用。有了这个基础,我们就知道,要想在桌面上添加Widget,那么需要完成两件事情:1、将桌面应用实现为一个WidgetHost应用2、CellLayout需要为每个添加的Widget分配足够大小的空间但是,为了添加到桌面上的widget能够和application们一样,那就应该具备如下的功能:3、Widget可以拖动4、Widget能够在多屏幕之间滑动5、widget能够从桌面移除对于第一个问题,上一篇中已经介绍了,就是在应用中加几段代码就可以解决了。关键问题是第二个,前面我们面临的都是最小的只占一个单元格大小的A 阅读全文

说说Android桌面(Launcher应用)背后的故事(九)——让我的桌面多姿多彩

2012-07-30 15:06 by tang768168, 415 阅读, 收藏,
摘要: 到这里我们的Launcher已经可以跑起来了,而且效果也如系统Launcher一般,但是,遗憾的是,我们的桌面上似乎都是一个摸样的Shortcut,而再看看系统桌面上,Search框,天气控件啊,各种大小参差不齐,界面上的控件丰富多彩。桌面上除了一个个Shortcut之外,还应该有各种大小不一的控件——Widget。 要想让我们的桌面也支持Widget,我们就要对Widget这个东西稍加研究一翻。Widget是一种特殊的独立体,可以嵌入在另一个应用中,只要这个应用实现为一个WidgetHost,那么它就可以容纳各式各样的Widget。Android已经提供了一套Widget开发接口,包括两个方 阅读全文

说说Android桌面(Launcher应用)背后的故事(八)——让桌面的精灵穿越起来

2012-07-30 15:04 by tang768168, 463 阅读, 收藏,
摘要: 有了前面的工作,基本上这个桌面就已经像模像样了,但是,和系统自带的Launcher相比,还差得很远。其中,系统Launcher的桌面上的item是可以任意穿越(移动)的。同时,在其穿越的过程中,你也可以将其kill掉。在这篇文章中,就让我们来看看桌面上的精灵如何实现她们穿越的梦想…. 系统Launcher为了实现item的拖拽,可谓下了很大的功夫,面面俱到。为了实现拖拽的功能,其定义了一组比较抽象的概念:拖拽源(DragSource);拖拽目的地(DragTarget);拖拽控制器(DragController);和拖拽界面(DragLayer)。DragSource主要用来表示桌面上的ite 阅读全文

说说Android桌面(Launcher应用)背后的故事(七)——又是一个附属品(可以转动的绚烂饼图)

2012-07-30 15:03 by tang768168, 374 阅读, 收藏,
摘要: 本来这一篇应该还是写Launcher中item拖拽的实现原理的,奈何,自从研究了Launcher,以前没有实现的,现在灵感全来了。这不,一个月前看到了著名记账软件随手记,看到android版中有一个炫酷的可以旋转的统计饼图,当时,下载了APK,反编译了下,奈何,不知道是不是在代码中进行了处理,没有反编译出源码来,半点都没有。只反编译成功了资源文件。当时,这个事情就放下了,虽然心很有不甘。但是,网上也没有看到有人实现,只能作罢。可是当研究完了Launcher之后,再来考量一下其实现原理,竟然恍然大悟般,于是乎,今天一天的时间,终于实现了其一样的功能。我现在倒觉得,分析了Launcher源码之后, 阅读全文

说说Android桌面(Launcher应用)背后的故事(五)——桌面壁纸的添加

2012-07-30 15:00 by tang768168, 402 阅读, 收藏,
摘要: 上一篇中,我们了解了Workspace是如何处理多个CellLayout之间的滑动的。这篇,将记录如何将壁纸添加到桌面,以及Workspace如何处理滑动的时候,壁纸的滑动。壁纸的添加,也是调用系统自带的,用如下方式调用:[java] view plaincopy//调用系统自带壁纸选择功能,ACTION_SET_WALLPAPER为选择的时候使用的过滤条件 Intent chooseIntent = new Intent(Intent.ACTION_SET_WALLPAPER); //启动系统选择应用 Intent intent = new Intent(Intent.ACTION_CHO. 阅读全文

说说Android桌面(Launcher应用)背后的故事(六)——研究Launcher而实现的附属品(可以拖拽的ListView)

2012-07-30 15:00 by tang768168, 473 阅读, 收藏,
摘要: 本来这一篇将写Android中Launcher是如何实现桌面上item的拖拽的,当研究了其机理之后,突然大脑发热,想实现一个可以拖拽的ListView,在理解了Launcher中item的拖拽,再来实现可以拖拽的ListView简直就是小菜一碟了。于是将此篇位于Launcher中拖拽之前,可以起到一个过渡理解的作用。只是,这里还有些不一样的地方就是Launcher上item拖拽后可以放到一个空的位置,而ListView中某个item被拖拽之后是需要交换新位置和原来位置上的item。下面,就不再废话了,直接上代码,具体需要注意的地方请看注释:[java] view plaincopypublic 阅读全文

说说Android桌面(Launcher应用)背后的故事(四)——揭秘Workspace

2012-07-30 14:59 by tang768168, 663 阅读, 收藏,
摘要: 前面说了Layout最主要的职责就是负责item的布局和空间的分配,这一节我们继续来看看CellLayout的父亲控件Workspace。手机的桌面是由几个屏幕的,你可以任意滑动的。这个布局就是一个Workspace。Launcher的Workspace主要的职责就是处理多个屏幕之间的滑动和壁纸的添加。这里先提下,我们知道DragLayer包含了Workspace,Workspace又包含了几个CellLayout,那么我们首先应该知道,它们是如何各司其职而互不影响的。这个就是Android中事件的传递机制。我们知道,一个应用中,整个的布局是一个树状,那么当用户的一个Touch操作,比如点击事 阅读全文

说说Android桌面(Launcher应用)背后的故事(三)——CellLayout的秘密

2012-07-30 14:57 by tang768168, 864 阅读, 收藏,
摘要: CellLayout的设计主要为了存放大小不一的控件。为了更好的控制item的添加和删除,选择直接继承ViewGroup来实现该控件。我们长按桌面的时候,有两种情况,一种是我们按的是一个item,还有一种是我们按的是一个空的位置。这里,就有一个问题。1、我怎么知道当前按下的位置上是空白区域还是item呢?2、就算我知道了当前的位置坐标,我又如何知道当前的坐标属于哪个单元格呢?3、如果上面两个问题都解决了,当我选择了某个要添加的item,这个item怎么样才能添加到指定的单元格呢,怎么根据当前item的大小来分配大小合适的空间呢?为了处理单元格和item占据的空间问题,CellLayout按照如 阅读全文

说说Android桌面(Launcher应用)背后的故事(二)——应用程序的添加

2012-07-26 18:40 by tang768168, 599 阅读, 收藏,
摘要: 上篇中,讲到了第一个功能中需要获取应用程序的信息,然后添加到桌面。这里,先记录下如何获取Android中的应用程序信息。一、调用系统快捷方式列表[java] view plaincopyIntent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); pickIntent.putExtra(Intent.EXTRA_TITLE, res.getString(R.str.. 阅读全文

说说Android桌面(Launcher应用)背后的故事(一)——揭开她神秘的面纱

2012-07-26 14:59 by tang768168, 434 阅读, 收藏,
摘要: 最近由于项目需要自己定制一套管理系统,遂想到了Android的启动器,下来了源码,一编译到处是错,查了查原因,原来是引用了自家的成员,他们家开发的就是方便,想直接用就直接用。于是下载了个包,终于错误少了一大半。但是还有一些错误,主要是引用了一些不存在的资源。于是改了改,基本可以运行了。但是,问题来了,一眼望去,红色叉叉是不见了,但是革命依然不容乐观,一个人我认识,但是一下子成千上百个人出现在我的面前,我就不是一点点晕了,而是晕的不行了。然而,军令如山,纵然晕,也得硬着头皮将革命进行下去,因为有一点是肯定的,革命必须胜利,不容失败! 接下来的一系列文章,就记录下我的革命之旅!本来打算在原有lau 阅读全文

Android Launcher全面剖析

2012-07-25 15:03 by tang768168, 891 阅读, 收藏,
摘要: 首先来说说我为什么写这篇文章,最近公司要我负责搞Launcher,网上一查这方面的资料比较少,并且不全,研究起来相当困难,所以就写了这篇文 章,希望对大家有帮助。这篇文章是相当长的,希望读者能耐心读下去,实际上也花了我很长时间来写。好了闲话少说,我们切入正题。 这篇文章我会讲以下Launcher内容: Launcher UI总体架构 Launcher Res下的Layout Launcher Res下的Xml文件 Launcher Manifest文件 Launcher 常用类介绍Launcher 启动过程 Launcher widget添加过程 Launcher celllayout的介绍一 阅读全文

AndroidICS4.0---->LockScreen锁屏流程【Android源码解析九】

2012-07-19 22:04 by tang768168, 1250 阅读, 收藏,
摘要: 先来说说LockScreen分类; 一、无锁屏; 二、锁屏: 1、UnLockScreen: 图案锁、 PIN锁, 密码锁; 2、LockScreen: 波纹锁; 转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/7753206有图有真相------> 接着我们来看看LockScreen的时序图:综上所述:1、createUnlockScreenFor()方法创建的是UnLockScreen界面,代码如下:[java] view plaincopyprint?ViewcreateUnlockScreenFor(UnlockM 阅读全文

Android中ICS4.0Launcher中Fold的功能详解【androidICS4.0-->Launcher系列三】

2012-07-19 22:02 by tang768168, 326 阅读, 收藏,
摘要: AndroidICS4.0的文件夹和2.3的文件夹区别比较大,主要区别有: 一、android2.3的文件夹大小是固定的,4.0的文件夹大小是按照里面的元素大小决定的。二、android2.3的文件夹图标是固定的文件夹的形式展示的,而4.0是从文件中取前3个的缩略图垂直展示在屏幕上的。估计谷歌怕侵犯苹果文件夹的知识产权,所以没有做成和苹果一样的效果。 三、android2.3的文件中可以放多于16的应用程序的快捷方式,而4.0最多只能放16个快捷方式。 四、android2.3的文件夹中的图标不可以交换位置,而4.0的文件夹中的图标可以相互交换位置。转载请标明出处:http://blog.cs 阅读全文

Android-->Launcher拖拽事件详解【androidICS4.0--Launcher系列二】

2012-07-19 21:56 by tang768168, 342 阅读, 收藏,
摘要: AndroidICS4.0版本的launcher拖 拽的流程,基本和2.3的相似。就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类。等等。4.0的改变有一些,但是不是特别大。这个月一 直在改动Launcher的缩略图的效果,4.0的缩略图的功能没有实现,还得从2.3的Launcher中摘出来。通过做这个缩略图对Launcher 的模块有一点点了解,拿来分享一下Launcher拖拽的工作流程。有图有真相!转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/7671318(1) 先来看看类之间的继承关系 图(1) (2.. 阅读全文

Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】

2012-07-19 21:54 by tang768168, 400 阅读, 收藏,
摘要: 最近研究ICS4.0的 Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程。Launcher其实是贯 彻于手机的整个系统的,时时刻刻都在运行,要是Launcher不运行了,手机就得黑屏了。Launcher的 LauncherMode=singletask,所以说不管Launcher启动了哪个应用,总有个Launcher的实例在堆栈中,并且位于栈底。点 击Home键进入到Launcher,上篇Android的全局键(home键/长按耳机键)详解【android源码解析八】 中有详细的介绍。大致思路其实就是启动launcher的时 阅读全文