android Launcher学习总结

转自:http://blog.csdn.net/lixuyuan/article/details/6688859

一、Launcher功能介绍

        Launcher简称HomeScreen,是android手机加载完毕后第一个启动的应用程序,它负责除应用本身操作外的所有操作,包括有几个桌面、点击应用程序图标启动应用程序、长时间按桌面出现上下文菜单、长按桌面图标出现垃圾箱、长按桌面应用程序后可以移动位置和设置壁纸等,虽然它负责的操作看是很多,但它和普通的应用程序具有一样的权限。

二、Launcer 中一些重要的类及其功能描述

       为了成为系统启动后第一个启动的应用程序,Launcher必须在其AndroidManifest.xml中添加<category  android:name="android.intent.category.HOME" />属性。                                

AddAdapter .java:                        长按桌面后弹出的添加到桌面对话框所对应的适配器。

AllApps2D.java:                            用于存储和现实所有应用程序列表 的视图。                                                                                                                                                    

DeleteZone.java:                         代表长按桌面应用程序所出现的删除按钮。                                                                                                                                                                   

DragController.java:                    用于控制拖动应用程序过程的类。                                                                                                                                                                                 

DragSource:.java                         定义一个可以成为拖动对象的接口。                                                                                                                                                                              

DragTarget.java:                          定义一个可以接受并处理拖动的接口。                                                                                                                                                                           

InstallShortcutReceiver.java:    安装快捷方式的接听器。                                                                                                                                                                                                   

Launcher.java:                             Launcher应用程序从Launcher开始执行。                                                                                                                                                            

LauncherModel.java:                  维护Launcher在内存中的状态,提供与数据库进行交互的API。                                                                                                                              

ShortcutAdapter.java:                 显示添加快件方式对话框                                                                                                                                                                                                  

UnstallShortcutReceiver.java:  卸载快捷方式的接听器。                                                                                                                                                                                                  

Workspace.java:                         所有屏幕的集合,实现主屏幕的拖动效果。                                                                                                                                                                  

CellLayout.java:                          代表桌面上的一屏。

三、Launcher应用程序列表内容读取过程

       Launcher从onCreate函数开始执行,初始化了一些变量,调用mModel.startLoader函数进行读取工作,LauncherModel中定义了一个Loader类,该类负责读取应用程序信息,Loader类创建一个线程LoaderThread来进行数据库的读取操作,LoaderThread中调用loadAndBindWorkspace函数实现了从数据库中读取桌面上应用程序信息,根据快捷方式、组件和文件夹区分开来存储在不同的列表中,bindWorkspace函数用来将已经存储的列表赋给Launcher对象,同时在Workspace中添加并显示这些视图对象。loadAndBindAllApps函数用来读取所有安装的应用程序信息存入列表中,并将当前列表赋给Launcher中的AllAppsView对象。

四、Launcher中桌面的滚动

       在桌面上,如果当前的事件是拖动事件,Workspace使用Scroller根据当前的移动的位置及距离进行桌面的移动效果。

五、Launcher桌面的点击事件

      首先判断当前所点击的位置放置的是什么东西,如果是快捷方式则启动当前快捷方式所代表的应用程序,如果是文件夹则显示当前文件夹中存在的内容,如果是所有应用程序列表按钮,则显示所有的应用程列表,其他情况则不进行处理。

六、Launcher中的长按事件

      如果当前长按的是桌面,则弹出添加到桌面对话框,如果有应用程序快捷方式,则根据当前的应用程序快捷方式创建一个DragView对象,当有移动事件时,移动当前的DragView对象,在拖动开始时删除区域会显示出来(DeleteZone设置为可见),当将图标拖入删除区域时,删除区域及DragView对象的背景颜色会改变,在删除区域中松开手可以实现将当前快捷方式从桌面上删除,图标离开删除区域时删除区域及DragView对象的背景会恢复成原来的样子。 在应用程序列表中,长按某个应用程序,则会关闭掉当前的应用程序列表,以后的拖动事件处理和在桌面上拖动应用程序快捷方式的效果是一样的。如果当前长按的是已打开文件夹的名字,则弹出更改文件夹名字对话框(如下图)。


七、Launcher中的拖动应用程序图标效果

      Launcher中使用WindowManager进行应用程序快捷方式的拖动。整个Android的窗口机制是基于WindowManager的,这个接口可以添加View到屏幕,也可以从屏幕删除一个View,它面向的一端是屏幕,另一端是View,直接忽略了Activity或者Dialog等东西,WindowManager是全局的。附件是我写的一个例子。                                                                

源代码:

  1. package lzu.WindowManagerTest;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.PixelFormat;  
  7. import android.os.Bundle;  
  8. import android.view.Gravity;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.WindowManager;  
  12. import android.widget.ImageView;  
  13.   
  14. public class WindowManagerTest extends Activity {  
  15.     /** Called when the activity is first created. */  
  16.       
  17.     private float mPosX;  
  18.     private float mPosY;  
  19.       
  20.     Bitmap bitmap;  
  21.       
  22.     WindowManager.LayoutParams mWindowParams;  
  23.       
  24.     WindowManager mWindowManager;  
  25.       
  26.     ImageView v;  
  27.       
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.           
  32.         setContentView(R.layout.main);  
  33.          
  34.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.button);  
  35.           
  36.         addViewToWindowManage(bitmap, 200200);  
  37.     }  
  38.       
  39.     public boolean onTouchEvent(MotionEvent motion){  
  40.         switch(motion.getAction()){  
  41.         case MotionEvent.ACTION_DOWN:  
  42.             mPosX = motion.getX();  
  43.             mPosY = motion.getY();  
  44.             return true;  
  45.         case MotionEvent.ACTION_MOVE:  
  46.             mPosX = motion.getX();  
  47.             mPosY = motion.getY();  
  48.             updateViewPosition(v, (int)mPosX,(int) mPosY);  
  49.             return true;  
  50.         case MotionEvent.ACTION_UP:  
  51.             removeView(v);  
  52.             return true;  
  53.         }  
  54.           
  55.         return true;  
  56.     }  
  57.      
  58.     void addViewToWindowManage(Bitmap bm, int x, int y) {  
  59.         mWindowParams = new WindowManager.LayoutParams();  
  60.         mWindowParams.gravity = Gravity.LEFT | Gravity.TOP;  
  61.         mWindowParams.x = x;  
  62.         mWindowParams.y = y;  
  63.         mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  64.         mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  65.         mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
  66.                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE  
  67.                 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
  68.                 | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;  
  69.         mWindowParams.format = PixelFormat.TRANSLUCENT;  
  70.         mWindowParams.windowAnimations = 0;  
  71.         v = new ImageView(this);  
  72.         v.setImageBitmap(bm);  
  73.         mWindowManager = (WindowManager) this.getSystemService("window");  
  74.         mWindowManager.addView(v, mWindowParams);  
  75.     }  
  76.       
  77.     void updateViewPosition(View v,int x,int y){  
  78.         mWindowParams.alpha = 1.0f;  
  79.         mWindowParams.x = x ;  
  80.         mWindowParams.y = y;  
  81.         mWindowManager.updateViewLayout(v, mWindowParams);  
  82.     }  
  83.       
  84.     void removeView(View v){  
  85.         mWindowManager.removeView(v);;  
  86.     }  
  87. }  
代码包下载地址: http://download.csdn.net/source/3521066

效果截图为:


由于本人表达能力有限,如果出现什么表达不清或者意思不清楚的,请您和我联系,谢谢您~

本文系“暑期大学生博客大赛-2011 Android成长篇“参赛文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值