`

Android Launcher桌面3D实现和原理分析

 
阅读更多

 

 

 

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就可以实现了。

 

 

[java] view plaincopy
 
  1. @Override  
  2.     protected void dispatchDraw(Canvas canvas) {  
  3.         boolean restore = false;  
  4.         int restoreCount = 0;  
  5.   
  6.         // ViewGroup.dispatchDraw() supports many features we don't need:  
  7.         // clip to padding, layout animation, animation listener, disappearing  
  8.         // children, etc. The following implementation attempts to fast-track  
  9.         // the drawing dispatch by drawing only what we know needs to be drawn.  
  10.   
  11.         boolean fastDraw = mTouchState != TOUCH_STATE_SCROLLING && mNextScreen == INVALID_SCREEN;  
  12.         // If we are not scrolling or flinging, draw only the current screen  
  13.         if (fastDraw) {  
  14.             //add by andy.xie 20120831  
  15.             getChildAt(<span class="s1">mCurrentScreen</span>).setBackgroundResource(android.R.color.transparent);  
  16.             drawChild(canvas, getChildAt(mCurrentScreen), getDrawingTime());  
  17.         } else {  
  18.             final long drawingTime = getDrawingTime();  
  19.             final float scrollPos = (float) mScrollX / getWidth();  
  20.             final int leftScreen = (int) scrollPos;  
  21.             final int rightScreen = leftScreen + 1;  
  22.          //edit by andy.xie 20120831  
  23. //            if (leftScreen >= 0) {  
  24. //                drawChild(canvas, getChildAt(leftScreen), drawingTime);  
  25. //            }  
  26. //            if (scrollPos != leftScreen && rightScreen < getChildCount()) {  
  27. //                drawChild(canvas, getChildAt(rightScreen), drawingTime);  
  28. //            }  
  29.             //add by andy.xie 20120831  
  30.             Camera camera = new Camera();  
  31.                 Matrix matrix = new Matrix();  
  32.                 int width = getWidth();  
  33.                 int height = getHeight();  
  34.   
  35.                 float rotateY = ((float)(mTouchX % width) / width) * 90;  
  36.                 if(rotateY < 0) rotateY = 0;  
  37.                 if(rotateY > 90) rotateY = 90;  
  38. if(rotateY > 90) rotateY = 90;  
  39.   
  40.                 //  
  41.                 Log.d("xxh""x=" + mTouchX + " rotateY=" + rotateY + " scrollPos=" + scrollPos);  
  42.   
  43.             if (leftScreen >= 0) {  
  44.                         //  
  45.                         canvas.save();  
  46.                         camera.save();  
  47.                         //camera.translate(0, 0, mWidth/2);  
  48.                         camera.rotateY(-rotateY);  
  49.                         camera.getMatrix(matrix);  
  50.                         camera.restore();  
  51.                         matrix.preTranslate(-width * ((int)scrollPos + 1), -height/2);  
  52.                         matrix.postTranslate(width * ((int)scrollPos + 1), height/2);  
  53.                         //  
  54.                         canvas.concat(matrix);  
  55.                 getChildAt(leftScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);  
  56.                         drawChild(canvas, getChildAt(leftScreen), drawingTime);  
  57. getChildAt(leftScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);  
  58.                         drawChild(canvas, getChildAt(leftScreen), drawingTime);  
  59.                         canvas.restore();  
  60.             }  
  61.   
  62.   
  63.             if (scrollPos != leftScreen && rightScreen < getChildCount()) {  
  64.                 Matrix matrix2 = new Matrix();  
  65.                 canvas.save();  
  66.                         camera.save();  
  67.                         //camera.translate(0, 0, mWidth/2);  
  68.                         camera.rotateY(90-rotateY);  
  69.                         camera.getMatrix(matrix2);  
  70.                         camera.restore();  
  71.                         matrix2.preTranslate(-width * ((int)scrollPos + 1), -height/2);  
  72.                         matrix2.postTranslate(width * ((int)scrollPos + 1), height/2);  
  73.                         //  
  74.                         canvas.concat(matrix2);  
  75.                 getChildAt(rightScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);  
  76. canvas.concat(matrix2);  
  77.                 getChildAt(rightScreen).setBackgroundResource(android.R.drawable.screen_background_dark_transparent);  
  78.                 drawChild(canvas, getChildAt(rightScreen), drawingTime);  
  79.                 canvas.restore();  
  80.             }  
  81.         }  
  82.   
  83.         if (restore) {  
  84.             canvas.restoreToCount(restoreCount);  
  85.         }  
  86.     }  
分享到:
评论

相关推荐

    Android应用源码之Android Launcher 桌面分页滑动代码.zip

    这个"Android应用源码之Android Launcher 桌面分页滑动代码"压缩包,显然是为了帮助开发者深入理解Android Launcher的实现原理,特别是关于桌面分页滑动的部分。下面将详细解析这个主题。 一、Android Launcher概述...

    Android项目源码-安卓Launcher原生桌面源码

    【Android项目源码-安卓Launcher原生桌面源码】是一个深入了解Android系统启动器(Launcher)工作原理的重要资源。源码提供了Android操作系统中的主屏幕和应用抽屉的实现细节,这对于Android开发者尤其是系统定制者...

    android桌面launcher源码 版本2.3

    版本2.3的Launcher源码提供了深入了解Android系统启动器工作原理的机会,这对于开发者尤其是Android定制和系统优化人员来说非常宝贵。源码的修改表明它可能已经过优化或功能增强,能够成功运行。 首先,我们来看看`...

    Android Launcher3源码

    通过分析`Launcher3`的源码,我们可以深入理解Android系统桌面的工作原理,了解如何定制自己的启动器。 1. **项目结构** `Launcher3`源码结构分为几个主要部分:UI组件、数据模型、后台服务、偏好设置和资源文件。...

    android Launcher2.2源码

    在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2(Froyo)版本的Launcher源码。 1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、...

    android launcher2源码

    本文将重点解析Android桌面应用Launcher2的源代码,旨在为开发者提供一个深入学习和理解其内部工作原理的窗口。 Launcher2是Android早期版本中的默认桌面应用,它负责展示应用图标、小部件以及处理用户的触摸事件。...

    android Launcher2文件夾功能分析

    `Launcher2`是Android早期版本中默认的Launcher应用,尽管在后来的Android版本中被更新的Launcher3(现在称为 Pixel Launcher)所取代,但`Launcher2`仍然是理解和学习Android启动器工作原理的重要参考。 1. **...

    修改Launcher让图标不显示在桌面或者主菜单中

    通过上述方法,我们可以实现在Android 2.3系统中自定义Launcher,使某些应用的图标不显示在桌面上或主菜单中。虽然Android 4.0版本有细微区别,但核心思路相同。这种方法不仅可以用于个性化桌面布局,还可以帮助...

    Android11 Launcher3

    - **源代码分析**:Launcher3的源代码是开源的,开发者可以从GitHub上的"Launcher3-master"项目获取,通过阅读和理解源码,可以深入学习Android启动器的实现细节。 - **调试工具**:使用Android Studio的调试...

    android桌面程序Launcher

    在分析`android-platform_packages_apps_launcher-6ec7c18`这个压缩包时,你将能看到上述组件和概念的具体实现,包括源代码、资源文件(如图片、布局XML)以及Android工程的构建配置。通过深入学习和理解这些源代码...

    android桌面Launcher2

    Launcher2是Android早期版本中的一个实现,相比现在的Launcher3(即Material Design风格的桌面)可能略显过时,但它对于学习Android系统工作原理非常有价值。 源码分析: 1. **Activity管理和启动**:在Launcher2...

    Launcher3原理及二次开发

    此资源是在安卓巴士交会上王鹏工程师分享的Launcher3的原理及二次开发pdf。文中介绍啦Launcher3的框架和主要流程,能给从事Lauuncher3开发和桌面定制的开发人员启迪。特此分享出来。

    android Launcher添加widget源码

    通过分析JYCLauncher的源码,我们可以深入了解Android自定义Launcher中添加Widget的细节,以及如何实现动态添加功能。这不仅可以帮助开发者理解Android系统的内部工作原理,还能为开发具有独特特性的Launcher应用...

    Android Launcher 桌面分页滑动代码.zip源码资源下载

    通过研究这个源码,开发者可以深入理解Android Launcher的工作原理,学习如何实现桌面分页滑动功能,并为自己的定制化需求打下坚实基础。同时,也可以借鉴其中的优化技巧,提升自己开发的Launcher的用户体验。

    Android桌面程序Launcher源码

    深入学习Android Launcher源码,有助于理解Android系统的运行机制,尤其是Activity的启动流程、BroadcastReceiver的工作原理、ContentProvider与数据库的交互,以及自定义View和动画的实现。这对于优化应用性能、...

    Android Launcher 源码

    Android Launcher 是Android操作系统中的核心组件之一,它是用户与设备交互的入口,负责显示应用程序的图标、小部件和其他桌面元素。源码分析可以帮助开发者深入理解Android系统的工作原理,从而提升应用开发的能力...

    android2.3 launcher分析三

    总的来说,Android 2.3 的 Launcher 实现了高度定制和用户友好的界面,通过巧妙的布局设计和组件管理,使得用户能够轻松地管理和访问他们的应用程序。理解这些内部工作原理对于开发者来说至关重要,因为这有助于创建...

    android 定制 launcher 4.0源码

    通过以上步骤,你可以逐步了解和掌握Android 4.0 Launcher的定制原理。这个过程可能需要花费不少时间,但能帮助你深入理解Android系统的工作机制,为将来开发自己的Launcher或者其他系统级别的定制打下坚实的基础。

    Android_launcher的源码详细分析.pdf

    Android_launcher 的源码分析是基于 2.1 版本的 Launcher2,虽然后续版本有所变化,但大致原理仍然保留。下面是该源码的主要组件和类的详细分析: 1. Launcher.java:Launcher 中的主要活动,负责处理用户交互和...

    android4.0 Launcher2

    这些文件反映了Launcher2的设计逻辑和实现细节。例如,`com.android.launcher2`包下包含了许多关键类,如`Workspace`、`LauncherModel`和`AppDrawer`等,它们分别负责桌面布局、数据加载和应用抽屉的管理。 2. 工作...

Global site tag (gtag.js) - Google Analytics