`

为launcher添加一个仿Mac的dock(附源码)

 
阅读更多
之前在网上看到有篇文章:Launcher之Dock细节篇http://news.wangmeng.cn/detailNews/2716-the-article-details-launcher-dock 它实现了一个仿Mac的dock。感觉蛮有意思的,所以就照着仿制了一个。

可以动态的添加快捷方式,默认包含AllApp按钮,图标居中显示。
文章后边附带的源码是基于android2.2自带的launcher2稍作修改而成,使用eclipse调试。

一、首先要在Launcher的setupViews函数里面初始化自己的layout(需增加3个地方)

[java] view plaincopy

    1.        
     
    dockbar=(DockBar)dragLayer.findViewById(R.id.dockbar); 
     
    dockbar.setLauncher(this);  
     
    dockbar.setDragController(dragController);       
     
    2. 
     
    dragController.setDragScoller(workspace); 
     
    dragController.setDragListener(deleteZone); 
     
    dragController.setDockDragListener(dockbar); // hmg25 add for dock 
     
      
     
    setDockDragListener为自定义函数,添加在DragController的startDrag中,具体见源码 
     
    if(mDockListener!=null){    
     
          mDockListener.onDragStart(source, dragInfo, dragAction);  
     
            } 
     
      
     
     
     
    3. 
     
    // The order here is bottom to top. 
     
    dragController.addDropTarget(workspace); 
     
    dragController.addDropTarget(dockbar);    //hmg25 add for dock 
     
    dragController.addDropTarget(deleteZone); 
     
      

 

二、在layout-port的launcher.xml中增加

[xhtml] view plaincopy

    <!--hmg add for dock {  -->  
     
     <com.android.launcher2.DockBar 
     
            android:id="@+id/dockbar" 
     
            android:layout_width="fill_parent" 
     
            android:layout_height="@dimen/button_bar_height" 
     
            android:layout_gravity="bottom|center_horizontal" 
     
            android:background="@drawable/dock_bg" 
     
            launcher:direction="horizontal"> 
     
            <HorizontalScrollView android:id="@+id/dock_scroll_view"  
     
            android:scrollbars="none"  
     
            android:fadingEdge="none"  
     
            android:saveEnabled="false"  
     
            android:layout_width="fill_parent"  
     
            android:layout_height="fill_parent"> 
     
            <LinearLayout android:orientation="horizontal"  
     
            android:id="@+id/dock_item_holder"       
     
            android:saveEnabled="false"  
     
            android:layout_width="fill_parent"  
     
            android:layout_height="fill_parent"> 
     
             <com.android.launcher2.HandleView   //默认将allapp按钮添加进去 
     
                android:id="@+id/all_apps_button" 
     
                android:layout_centerHorizontal="true" 
     
                android:src="@drawable/all_apps_button" 
     
                launcher:direction="horizontal"         
     
                android:layout_width="fill_parent" 
     
                android:layout_height="fill_parent" 
     
                android:focusable="true" 
     
                android:clickable="true" 
     
                /> 
     
            </LinearLayout> 
     
        </HorizontalScrollView> 
     
    </com.android.launcher2.DockBar> 
     
     <!--hmg add for dock  } -->   

 

三、创建自定义的类:

[java] view plaincopy

    public class DockBar extends LinearLayout implements DropTarget, DragSource, 
     
    DragController.DragListener,View.OnLongClickListener { 
     
      
     
    @Override 
     
        public boolean acceptDrop(DragSource source, int x, int y, int xOffset,int yOffset,DragView dragView, Object dragInfo) {                  
     
         //接受什么类型的图标         
     
          Log.i("hmg", "DockBar->acceptDrop"); 
     
         final ItemInfo item = (ItemInfo) dragInfo;        
     
         if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET                 
     
         || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER                 
     
         || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER                  
     
         || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME                 
     
         || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH                 
     
         || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_CLOCK) {          
     
         return false;         
     
         }   
     
         return true;  
     
         } 
     
      
     
      
     
      
     
    //拖拽释放时响应下边函数 
     
    @Override 
     
        public void onDrop(DragSource source, int x, int y, int xOffset, 
     
             int yOffset, DragView dragView, Object dragInfo) { 
     
      
     
         int position=0; 
     
         position=getLocation(x); //根据释放时的坐标,获取插入位置 
     
         addItemAt((ItemInfo)dragInfo, position);     
     
        } 
     
    /*
    
         * 传入x坐标,判断新图标的位置,此处仅判断竖屏
    
         */ 
     
        public int getLocation(int x){    
     
                for(int i=0;i<mItemHolder.getChildCount();i++){    
     
                    View iv = mItemHolder.getChildAt(i);            
     
                    int[] position = new int[2]; 
     
                    //获取坐标,如果要适应横屏可以稍作修改,比较Y值 
     
                    iv.getLocationOnScreen(position); 
     
                    //判断释放时新增的图标在原图标的之前还是之后 
     
                     if(x<=(position[0]+(iv.getWidth()/2))){                         
     
                             return i;                       
     
                     }                     
     
                 }     
     
                 return mItemHolder.getChildCount();    
     
             }   
     
      
     
      
     
    private void addItemAt(ItemInfo itemInfo, int position) 
     
        { 
     
         View view=null; 
     
         switch (itemInfo.itemType) { 
     
         case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 
     
         case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:      
     
             ShortcutInfo shortcutInfo; 
     
         // 拖拽图标来自于app list 
     
         if(itemInfo.container ==NO_ID&& itemInfo instanceof ApplicationInfo)         
     
         { 
     
             //与来自桌面的图标包含信息不一样,具体看源码 
     
             shortcutInfo= new ShortcutInfo((ApplicationInfo)itemInfo); 
     
         } 
     
         else 
     
         shortcutInfo = (ShortcutInfo)itemInfo; //拖拽图标来自桌面 
     
         //调用Launcher中的CreateDockShortcut生成一个imageView 
     
         view = mLauncher. CreateDockShortcut (shortcutInfo); 
     
          view.setOnLongClickListener(this);   
     
           break; 
     
         case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER: 
     
             break; 
     
         default: 
     
             throw new IllegalStateException("Unknown item type: " 
     
                 + itemInfo.itemType); 
     
         }    
     
         mItemHolder.addView(view, position);      
     
    } 
     
      
     
    之所以将新建view用Launcher. CreateDockShortcut是想直接使用Launcher中的单击事件。 
     
    View CreateDockShortcut (ShortcutInfo shortcutInfo) 
     
        {  
     
         Context context=getApplicationContext(); 
     
         ImageView imageView =new ImageView(context);     
     
         imageView.setImageBitmap(shortcutInfo.mIcon); 
     
         imageView.setOnClickListener(this); 
     
         imageView.setFocusable(true); 
     
         imageView.setTag(shortcutInfo); 
     
         imageView.setMinimumWidth(100); 
     
         return imageView; 
     
        } 
     
      
     
     在dock上长按,拖拽交换位置或者拖拽出去 
     
    @Override 
     
        public boolean onLongClick(View v) { 
     
         // TODO Auto-generated method stub 
     
          if (mLauncher.isAllAppsVisible()) 
     
             mLauncher.closeAllApps(false); 
     
             mSelectedView = v;         
     
    //开始拖拽 
     
         mDragController.startDrag(v, this, v.getTag(), 
     
             DragController.DRAG_ACTION_MOVE); 
     
          removeSelectedItem(); 
     
             return true; 
     
        } 
     
    private void removeSelectedItem() 
     
        { 
     
          if (mSelectedView == null) 
     
            return; 
     
          mItemHolder.removeView(mSelectedView); 
     
        } 



代码修改了不少地方,具体看代码,修改的地方我都标注啦 ~~欢迎大家指教,相互交流~~

源码地址:http://download.csdn.net/source/3142047
分享到:
评论

相关推荐

    仿Mac的dock android Launcher

    "LauncherEx"可能是一个特定的第三方Android Launcher应用,旨在模仿Mac的Dock设计。此应用可能会有以下特性: 1. **Dock栏**:在屏幕底部,像Mac一样显示常驻应用的图标,用户可以自定义这些图标。 2. **动画效果**...

    Android 仿Mac的Dock.zip

    "Android 仿Mac的Dock.zip"是一个针对这一需求的解决方案,它旨在为Android设备带来类似MacOS的操作体验,尤其是其标志性的Dock功能。Dock在MacOS中是用于快速启动应用程序、切换任务和组织常用应用的工具栏。这个...

    仿小米电视桌面launcher源码Demo

    仿小米电视桌面launcher源码Demo,改桌面采用 类似小米一样的metro风格的 设计,可以通过远程配置控制桌面显示 的内容,非常棒,成功用于多个机顶盒ott项目。无积分或者不想登陆点我头像发给你。

    android Launcher源码详解

    Android Launcher 是 Android 系统中一个非常重要的组件,负责显示桌面程序和管理应用程序图标。了解 Launcher 的源码可以帮助我们更好地理解 Android 系统的设计思想和实现机制。本文将对 Launcher 的源码进行深入...

    android Launcher添加widget源码

    在Android系统中,Launcher是用户界面的一个重要组成部分,它提供了应用程序的启动图标和小部件(Widgets)等元素,使得用户可以方便地访问和管理手机上的应用。本篇将深入探讨如何在自定义的Launcher中添加Widget,...

    安卓Android源码——仿Mac的Dock.zip

    【标题】"安卓Android源码——仿Mac的Dock.zip" 提供的是一个关于在Android平台上实现类似Mac操作系统Dock栏功能的源代码项目。Dock栏在操作系统中起着至关重要的作用,它提供了一种便捷的方式,让用户可以快速访问...

    Android应用源码高仿小米launcher(ZAKER)跨屏拖动.zip

    在Android应用开发中,"高仿小米launcher(ZAKER)跨屏拖动"是一个常见的实践,旨在为用户提供类似小米手机启动器或ZAKER新闻应用那样的交互体验。这份源码提供了实现这一功能的详细步骤和代码,对于想要深入理解...

    安卓Android源码——高仿小米launcher(ZAKER)跨屏拖动item.zip

    本压缩包"安卓Android源码——高仿小米launcher(ZAKER)跨屏拖动item.zip"提供了对小米Launcher(ZAKER风格)跨屏拖动item功能的实现,这对于开发者来说是一个宝贵的资源,可以帮助他们学习如何构建类似的应用启动器...

    Android Launcher3源码

    **Android Launcher3源码详解** Android系统的桌面启动器(Launcher)是用户与设备交互的核心界面,它负责展示应用快捷方式、小部件以及主屏幕布局。其中,`Launcher3`是Android开源项目AOSP(Android Open Source ...

    安卓Android源码——Android Launcher 源码修改可编译.zip

    源码是了解一个软件工作原理的最直接途径,对于开发者来说,能够访问并理解Android源码,有助于他们优化应用性能,解决兼容性问题,以及开发独特的功能。 【文件名解析】 DisplayAudioTheme,这个文件名可能是项目...

    android Launcher2.2源码

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

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

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

    win7仿mac launcher

    1. **Dock栏**:仿照Mac OS中的Dock栏,"win7仿Mac Launcher"会在屏幕底部创建一个类似的条目,用户可以将常用的程序图标添加到其中。点击图标即可启动程序,同时,运行中的应用会显示活动状态,如闪烁的图标,以...

    Android Launcher 源码修改可编译.zip源码资源下载

    为了修改和编译Android Launcher源码,你需要一个完整的Android开发环境,包括安装了Android SDK、Android Studio和必要的工具链。以下是一般步骤: 1. **导入项目**:在Android Studio中打开源码目录,通过"File" ...

    rk_launcher模拟苹果dock

    "rk_launcher模拟苹果dock"是一款专为用户打造的桌面插件,旨在为非苹果设备提供类似苹果MacOS系统中的Dock栏体验。这款小巧且美观的工具,能够让你的Windows或其他非苹果操作系统拥有苹果风格的底部任务栏,提升...

    Android源码——仿Mac的Dock.zip

    【Android源码——仿Mac的Dock.zip】是一个包含Android源代码的压缩包,其目标是实现一个类似于Mac操作系统的Dock栏效果。Dock栏在Mac OS中是一个重要的界面元素,它位于屏幕底部,显示常用的应用程序图标,用户可以...

    Andriod8.0 Launcher3源码

    Android 8.0(代号Oreo)是Google推出的Android操作系统的一个重大版本,它引入了许多改进和新特性。其中,Launcher3是Android系统的核心组件之一,它是用户与设备交互的主要界面,负责显示和管理应用程序图标、小...

    Launcher源码

    《Android 2.2原生Launcher源码解析》 Android系统中的Launcher,即启动器,是用户与系统交互的首要界面,它负责...同时,源码学习也能提升我们对Android系统整体框架的理解,有助于成为一个更出色的Android开发者。

    Android下高仿小米Launcher跨屏拖动源码

    本项目聚焦于一个特定的主题:“高仿小米Launcher跨屏拖动”的源码分析,这对于深入理解Android Launcher的工作原理以及自定义启动器的开发具有很高的学习价值。 首先,我们要理解什么是跨屏拖动。在传统的Android ...

    android ATV Launcher 源码

    1.适用android 盒子,1920*1080(密度240),1280*720(密度160),1280*720(密度...3,主页功能介绍(第一排,左边语音调起,右边时间,第二排,常用国外视频app,第三排所有apps,第四排设置,以太网,wifi 网络标识)

Global site tag (gtag.js) - Google Analytics