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

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

可以动态的添加快捷方式,默认包含AllApp按钮,图标居中显示。

  

DockBar上的图标可以相互交换位置,并且将图标拖拽出去。

 

拖拽释放后:

 

  文章后边附带的源码是基于android2.2自带的launcher2稍作修改而成,使用eclipse调试。

 

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

 

  1. 1.         
  2.   
  3. dockbar=(DockBar)dragLayer.findViewById(R.id.dockbar);  
  4.   
  5. dockbar.setLauncher(this);   
  6.   
  7. dockbar.setDragController(dragController);        
  8.   
  9. 2.  
  10.   
  11. dragController.setDragScoller(workspace);  
  12.   
  13. dragController.setDragListener(deleteZone);  
  14.   
  15. dragController.setDockDragListener(dockbar); // hmg25 add for dock  
  16.   
  17.    
  18.   
  19. setDockDragListener为自定义函数,添加在DragController的startDrag中,具体见源码  
  20.   
  21. if(mDockListener!=null){     
  22.   
  23.       mDockListener.onDragStart(source, dragInfo, dragAction);   
  24.   
  25.         }  
  26.   
  27.    
  28.   
  29.   
  30.   
  31. 3.  
  32.   
  33. // The order here is bottom to top.  
  34.   
  35. dragController.addDropTarget(workspace);  
  36.   
  37. dragController.addDropTarget(dockbar);    //hmg25 add for dock  
  38.   
  39. dragController.addDropTarget(deleteZone);  
  40.   
  41.    
  

 

二、在layout-portlauncher.xml中增加

 

 

  1. <!--hmg add for dock {  -->   
  2.   
  3.  <com.android.launcher2.DockBar  
  4.   
  5.         android:id="@+id/dockbar"  
  6.   
  7.         android:layout_width="fill_parent"  
  8.   
  9.         android:layout_height="@dimen/button_bar_height"  
  10.   
  11.         android:layout_gravity="bottom|center_horizontal"  
  12.   
  13.         android:background="@drawable/dock_bg"  
  14.   
  15.         launcher:direction="horizontal">  
  16.   
  17.         <HorizontalScrollView android:id="@+id/dock_scroll_view"   
  18.   
  19.         android:scrollbars="none"   
  20.   
  21.         android:fadingEdge="none"   
  22.   
  23.         android:saveEnabled="false"   
  24.   
  25.         android:layout_width="fill_parent"   
  26.   
  27.         android:layout_height="fill_parent">  
  28.   
  29.         <LinearLayout android:orientation="horizontal"   
  30.   
  31.         android:id="@+id/dock_item_holder"        
  32.   
  33.         android:saveEnabled="false"   
  34.   
  35.         android:layout_width="fill_parent"   
  36.   
  37.         android:layout_height="fill_parent">  
  38.   
  39.          <com.android.launcher2.HandleView   //默认将allapp按钮添加进去  
  40.   
  41.             android:id="@+id/all_apps_button"  
  42.   
  43.             android:layout_centerHorizontal="true"  
  44.   
  45.             android:src="@drawable/all_apps_button"  
  46.   
  47.             launcher:direction="horizontal"          
  48.   
  49.             android:layout_width="fill_parent"  
  50.   
  51.             android:layout_height="fill_parent"  
  52.   
  53.             android:focusable="true"  
  54.   
  55.             android:clickable="true"  
  56.   
  57.             />  
  58.   
  59.         </LinearLayout>  
  60.   
  61.     </HorizontalScrollView>  
  62.   
  63. </com.android.launcher2.DockBar>  
  64.   
  65.  <!--hmg add for dock  } -->    
  

 

三、创建自定义的类:

 

  1. public class DockBar extends LinearLayout implements DropTarget, DragSource,  
  2.   
  3. DragController.DragListener,View.OnLongClickListener {  
  4.   
  5.    
  6.   
  7. @Override  
  8.   
  9.     public boolean acceptDrop(DragSource source, int x, int y, int xOffset,int yOffset,DragView dragView, Object dragInfo) {                   
  10.   
  11.      //接受什么类型的图标          
  12.   
  13.       Log.i("hmg""DockBar->acceptDrop");  
  14.   
  15.      final ItemInfo item = (ItemInfo) dragInfo;         
  16.   
  17.      if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET                  
  18.   
  19.      || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER                  
  20.   
  21.      || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER                   
  22.   
  23.      || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME                  
  24.   
  25.      || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH                  
  26.   
  27.      || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_WIDGET_CLOCK) {           
  28.   
  29.      return false;          
  30.   
  31.      }    
  32.   
  33.      return true;   
  34.   
  35.      }  
  36.   
  37.    
  38.   
  39.    
  40.   
  41.    
  42.   
  43. //拖拽释放时响应下边函数  
  44.   
  45. @Override  
  46.   
  47.     public void onDrop(DragSource source, int x, int y, int xOffset,  
  48.   
  49.          int yOffset, DragView dragView, Object dragInfo) {  
  50.   
  51.    
  52.   
  53.      int position=0;  
  54.   
  55.      position=getLocation(x); //根据释放时的坐标,获取插入位置  
  56.   
  57.      addItemAt((ItemInfo)dragInfo, position);      
  58.   
  59.     }  
  60.   
  61. /* 
  62.  
  63.      * 传入x坐标,判断新图标的位置,此处仅判断竖屏 
  64.  
  65.      */  
  66.   
  67.     public int getLocation(int x){     
  68.   
  69.             for(int i=0;i<mItemHolder.getChildCount();i++){     
  70.   
  71.                 View iv = mItemHolder.getChildAt(i);             
  72.   
  73.                 int[] position = new int[2];  
  74.   
  75.                 //获取坐标,如果要适应横屏可以稍作修改,比较Y值  
  76.   
  77.                 iv.getLocationOnScreen(position);  
  78.   
  79.                 //判断释放时新增的图标在原图标的之前还是之后  
  80.   
  81.                  if(x<=(position[0]+(iv.getWidth()/2))){                          
  82.   
  83.                          return i;                        
  84.   
  85.                  }                      
  86.   
  87.              }      
  88.   
  89.              return mItemHolder.getChildCount();     
  90.   
  91.          }    
  92.   
  93.    
  94.   
  95.    
  96.   
  97. private void addItemAt(ItemInfo itemInfo, int position)  
  98.   
  99.     {  
  100.   
  101.      View view=null;  
  102.   
  103.      switch (itemInfo.itemType) {  
  104.   
  105.      case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:  
  106.   
  107.      case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:       
  108.   
  109.          ShortcutInfo shortcutInfo;  
  110.   
  111.      // 拖拽图标来自于app list  
  112.   
  113.      if(itemInfo.container ==NO_ID&& itemInfo instanceof ApplicationInfo)          
  114.   
  115.      {  
  116.   
  117.          //与来自桌面的图标包含信息不一样,具体看源码  
  118.   
  119.          shortcutInfo= new ShortcutInfo((ApplicationInfo)itemInfo);  
  120.   
  121.      }  
  122.   
  123.      else  
  124.   
  125.      shortcutInfo = (ShortcutInfo)itemInfo; //拖拽图标来自桌面  
  126.   
  127.      //调用Launcher中的CreateDockShortcut生成一个imageView  
  128.   
  129.      view = mLauncher. CreateDockShortcut (shortcutInfo);  
  130.   
  131.       view.setOnLongClickListener(this);    
  132.   
  133.        break;  
  134.   
  135.      case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:  
  136.   
  137.          break;  
  138.   
  139.      default:  
  140.   
  141.          throw new IllegalStateException("Unknown item type: "  
  142.   
  143.              + itemInfo.itemType);  
  144.   
  145.      }     
  146.   
  147.      mItemHolder.addView(view, position);       
  148.   
  149. }  
  150.   
  151.    
  152.   
  153. 之所以将新建view用Launcher. CreateDockShortcut是想直接使用Launcher中的单击事件。  
  154.   
  155. View CreateDockShortcut (ShortcutInfo shortcutInfo)  
  156.   
  157.     {   
  158.   
  159.      Context context=getApplicationContext();  
  160.   
  161.      ImageView imageView =new ImageView(context);      
  162.   
  163.      imageView.setImageBitmap(shortcutInfo.mIcon);  
  164.   
  165.      imageView.setOnClickListener(this);  
  166.   
  167.      imageView.setFocusable(true);  
  168.   
  169.      imageView.setTag(shortcutInfo);  
  170.   
  171.      imageView.setMinimumWidth(100);  
  172.   
  173.      return imageView;  
  174.   
  175.     }  
  176.   
  177.    
  178.   
  179.  在dock上长按,拖拽交换位置或者拖拽出去  
  180.   
  181. @Override  
  182.   
  183.     public boolean onLongClick(View v) {  
  184.   
  185.      // TODO Auto-generated method stub  
  186.   
  187.       if (mLauncher.isAllAppsVisible())  
  188.   
  189.          mLauncher.closeAllApps(false);  
  190.   
  191.          mSelectedView = v;          
  192.   
  193. //开始拖拽  
  194.   
  195.      mDragController.startDrag(v, this, v.getTag(),  
  196.   
  197.          DragController.DRAG_ACTION_MOVE);  
  198.   
  199.       removeSelectedItem();  
  200.   
  201.          return true;  
  202.   
  203.     }  
  204.   
  205. private void removeSelectedItem()  
  206.   
  207.     {  
  208.   
  209.       if (mSelectedView == null)  
  210.   
  211.         return;  
  212.   
  213.       mItemHolder.removeView(mSelectedView);  
  214.   
  215.     }  

 

 

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

源码地址:http://download.csdn.net/source/3142047

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要下载Android车载导航Launcher源码,首先需要找到合适的网站或平台。可以通过搜索引擎搜索相关关键词,如“Android车载导航Launcher源码下载”来寻找相关资源。或者也可以通过开发者社区,如GitHub、StackOverflow等寻找开源项目。 一旦找到合适的下载资源,确保源码与您所需的功能和需求相匹配。仔细阅读项目的说明文档、许可证和用户评价等信息,确保该源码符合您的要求。 在进行下载之前,确保您具备开发环境以及相应的开发工具和技术知识。一般情况下,车载导航Launcher是基于Android平台的,因此您需要拥有Android开发环境和Android开发工具包(SDK)。 下载源码后,解压文件并打开项目。您可以使用Android Studio等IDE(集成开发环境)来导入项目,并根据您的需求进行配置和修改。 在进行任何修改之前,建议先阅读项目的文档和代码结构,熟悉项目的整体逻辑和功能。这样能更好地理解代码,并确保修改不会影响原有功能的稳定性和正确性。 修改完毕后,您可以根据自己的需要进行构建、编译和测试。确保应用在车载设备上的兼容性和稳定性。 最后,如果您对该源码进行了改进或优化,也可以考虑将您的成果贡献给开源社区,以便其他开发者也能受益。 总之,下载Android车载导航Launcher源码需要找到合适的下载资源、具备开发环境和工具、熟悉项目结构和代码逻辑、进行修改和测试。这样才能成功地下载并使用源码来满足您的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值