by: andy.xie 转载请注明出处 http://blog.csdn.net/xiexh0921/article/details/7929847
1,概述:
Launcher桌面由Workspace.java包含Celllayout.java构成,一个celllayout就是一个桌面,默认5个。 Workspace和celllayout都继承于viewgroup。
2,获得Touch坐标:
Launcher.java为activity,workspace是viewgroup。所以在activity中会注册一个scroller来记录滑动状态,scroller start后workspace中的computeScroll() 会接收到scroller的状态。这里获取到 mTouchX = mScrollX = mScroller.getCurrX();。Launcher会对滑动事件进行管理使得每次都能切屏或返回,而不会出现滑动到一半的状态。
3,重绘view:
scroller start的时候会不断重绘view直到scroller结束(mScroller.computeScrollOffset()返回false),所以要实现效果只需直接修改dispathDraw函数。dispathDraw和onDraw的区别是一个是画自己一个是画子view,dispathDraw在onDraw之后执行。
这里我们要实现伪3D效果,所以不用opengl,根据上面得到的mTouchX直接用camera和matrix配合就可以实现了。根据上面得到的mTouchX计算出子view需要旋转的角度,隐藏childview后,1)用drawchild画子view;2)直接抓取子view的bitmap(getChildAt(0).buildDrawingCache();Bitmap bitmap = getChildAt(0).getDrawingCache();)然后画到workspace的canvas。
4,实现代码:
上面大概的讲了下原理,下面给出实现代码,其实很简单,只需要修改Launcher2中的workspace.java就可以实现了。
- @Override
- protected void dispatchDraw(Canvas canvas) {
- boolean restore = false;
- int restoreCount = 0;
- // ViewGroup.dispatchDraw() supports many features we don't need:
- // clip to padding, layout animation, animation listener, disappearing
- // children, etc. The following implementation attempts to fast-track
- // the drawing dispatch by drawing only what we know needs to be drawn.
- boolean fastDraw = mTouchState != TOUCH_STATE_SCROLLING && mNextScreen == INVALID_SCREEN;
- // If we are not scrolling or flinging, draw only the current screen
- if (fastDraw) {
- //add by andy.xie 20120831
- getChildAt(<span class="s1">mCurrentScreen</span>).setBackgroundResource(android.R.color.transparent);
- drawChild(canvas, getChildAt(mCurrentScreen), getDrawingTime());
- } else {
- final long drawingTime = getDrawingTime();
- final float scrollPos = (float) mScrollX / getWidth();
- final int leftScreen = (int) scrollPos;
- final int rightScreen = leftScreen + 1;
- //edit by andy.xie 20120831
- // if (leftScreen >= 0) {
- // drawChild(canvas, getChildAt(leftScreen), drawingTime);
- // }
- // if (scrollPos != leftScreen && rightScreen < getChildCount()) {
- // drawChild(canvas, getChildAt(rightScreen), drawingTime);
- // }
- //add by andy.xie 20120831
- Camera camera = new Camera();
- Matrix matrix = new Matrix();
- int width = getWidth();
- int height = getHeight();
- float rotateY = ((float)(mTouchX % width) / width) * 90;
- if(rotateY < 0) rotateY = 0;
- if(rotateY > 90) rotateY = 90;
- if(rotateY > 90) rotateY = 90;
- //
- Log.d("xxh", "x=" + mTouchX + " rotateY=" + rotateY + " scrollPos=" + scrollPos);
- if (leftScreen >= 0) {
- //
- canvas.save();
- camera.save();
- //camera.translate(0, 0, mWidth/2);
- camera.rotateY(-rotateY);
- camera.getMatrix(matrix);
- camera.restore();
- matrix.preTranslate(-width * ((int)scrollPos + 1), -height/2);
- matrix.postTranslate(width * ((int)scrollPos + 1), height/2);
- //
- canvas.concat(matrix);
- getChildAt(leftScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);
- drawChild(canvas, getChildAt(leftScreen), drawingTime);
- getChildAt(leftScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);
- drawChild(canvas, getChildAt(leftScreen), drawingTime);
- canvas.restore();
- }
- if (scrollPos != leftScreen && rightScreen < getChildCount()) {
- Matrix matrix2 = new Matrix();
- canvas.save();
- camera.save();
- //camera.translate(0, 0, mWidth/2);
- camera.rotateY(90-rotateY);
- camera.getMatrix(matrix2);
- camera.restore();
- matrix2.preTranslate(-width * ((int)scrollPos + 1), -height/2);
- matrix2.postTranslate(width * ((int)scrollPos + 1), height/2);
- //
- canvas.concat(matrix2);
- getChildAt(rightScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);
- canvas.concat(matrix2);
- getChildAt(rightScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);
- drawChild(canvas, getChildAt(rightScreen), drawingTime);
- canvas.restore();
- }
- }
- if (restore) {
- canvas.restoreToCount(restoreCount);
- }
- }
相关推荐
这个"Android应用源码之Android Launcher 桌面分页滑动代码"压缩包,显然是为了帮助开发者深入理解Android Launcher的实现原理,特别是关于桌面分页滑动的部分。下面将详细解析这个主题。 一、Android Launcher概述...
【Android项目源码-安卓Launcher原生桌面源码】是一个深入了解Android系统启动器(Launcher)工作原理的重要资源。源码提供了Android操作系统中的主屏幕和应用抽屉的实现细节,这对于Android开发者尤其是系统定制者...
版本2.3的Launcher源码提供了深入了解Android系统启动器工作原理的机会,这对于开发者尤其是Android定制和系统优化人员来说非常宝贵。源码的修改表明它可能已经过优化或功能增强,能够成功运行。 首先,我们来看看`...
通过分析`Launcher3`的源码,我们可以深入理解Android系统桌面的工作原理,了解如何定制自己的启动器。 1. **项目结构** `Launcher3`源码结构分为几个主要部分:UI组件、数据模型、后台服务、偏好设置和资源文件。...
在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2(Froyo)版本的Launcher源码。 1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、...
本文将重点解析Android桌面应用Launcher2的源代码,旨在为开发者提供一个深入学习和理解其内部工作原理的窗口。 Launcher2是Android早期版本中的默认桌面应用,它负责展示应用图标、小部件以及处理用户的触摸事件。...
`Launcher2`是Android早期版本中默认的Launcher应用,尽管在后来的Android版本中被更新的Launcher3(现在称为 Pixel Launcher)所取代,但`Launcher2`仍然是理解和学习Android启动器工作原理的重要参考。 1. **...
通过上述方法,我们可以实现在Android 2.3系统中自定义Launcher,使某些应用的图标不显示在桌面上或主菜单中。虽然Android 4.0版本有细微区别,但核心思路相同。这种方法不仅可以用于个性化桌面布局,还可以帮助...
- **源代码分析**:Launcher3的源代码是开源的,开发者可以从GitHub上的"Launcher3-master"项目获取,通过阅读和理解源码,可以深入学习Android启动器的实现细节。 - **调试工具**:使用Android Studio的调试...
在分析`android-platform_packages_apps_launcher-6ec7c18`这个压缩包时,你将能看到上述组件和概念的具体实现,包括源代码、资源文件(如图片、布局XML)以及Android工程的构建配置。通过深入学习和理解这些源代码...
Launcher2是Android早期版本中的一个实现,相比现在的Launcher3(即Material Design风格的桌面)可能略显过时,但它对于学习Android系统工作原理非常有价值。 源码分析: 1. **Activity管理和启动**:在Launcher2...
此资源是在安卓巴士交会上王鹏工程师分享的Launcher3的原理及二次开发pdf。文中介绍啦Launcher3的框架和主要流程,能给从事Lauuncher3开发和桌面定制的开发人员启迪。特此分享出来。
通过分析JYCLauncher的源码,我们可以深入了解Android自定义Launcher中添加Widget的细节,以及如何实现动态添加功能。这不仅可以帮助开发者理解Android系统的内部工作原理,还能为开发具有独特特性的Launcher应用...
通过研究这个源码,开发者可以深入理解Android Launcher的工作原理,学习如何实现桌面分页滑动功能,并为自己的定制化需求打下坚实基础。同时,也可以借鉴其中的优化技巧,提升自己开发的Launcher的用户体验。
深入学习Android Launcher源码,有助于理解Android系统的运行机制,尤其是Activity的启动流程、BroadcastReceiver的工作原理、ContentProvider与数据库的交互,以及自定义View和动画的实现。这对于优化应用性能、...
Android Launcher 是Android操作系统中的核心组件之一,它是用户与设备交互的入口,负责显示应用程序的图标、小部件和其他桌面元素。源码分析可以帮助开发者深入理解Android系统的工作原理,从而提升应用开发的能力...
总的来说,Android 2.3 的 Launcher 实现了高度定制和用户友好的界面,通过巧妙的布局设计和组件管理,使得用户能够轻松地管理和访问他们的应用程序。理解这些内部工作原理对于开发者来说至关重要,因为这有助于创建...
通过以上步骤,你可以逐步了解和掌握Android 4.0 Launcher的定制原理。这个过程可能需要花费不少时间,但能帮助你深入理解Android系统的工作机制,为将来开发自己的Launcher或者其他系统级别的定制打下坚实的基础。
Android_launcher 的源码分析是基于 2.1 版本的 Launcher2,虽然后续版本有所变化,但大致原理仍然保留。下面是该源码的主要组件和类的详细分析: 1. Launcher.java:Launcher 中的主要活动,负责处理用户交互和...
这些文件反映了Launcher2的设计逻辑和实现细节。例如,`com.android.launcher2`包下包含了许多关键类,如`Workspace`、`LauncherModel`和`AppDrawer`等,它们分别负责桌面布局、数据加载和应用抽屉的管理。 2. 工作...