- 浏览: 205855 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xumin_minzi:
我也在使用ndk编译,ffmpeg源码放在哪个目录里面?
[原创]Android ndkr8编译 FFmpeg 0.11.1 "Happiness" -
ericchan2012:
在Dialog调用show方法之后
【原创】Android 设置Dialog的长宽和位置 -
maohualei:
求解: 我设置的时候 位置居然没有反应 dial ...
【原创】Android 设置Dialog的长宽和位置
之前在网上看到有篇文章: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
可以动态的添加快捷方式,默认包含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
发表评论
-
拖拽滑动_有3D_有循环
2012-12-11 17:38 1135android桌面拖拽3d效果 -
三星通讯录滑动出发开关
2012-12-11 17:37 904下面的代码是仿三星9300中的滑动打电话和发短信的。 -
三星通讯录滑动触发开关以及StatusBar下拉快捷键的效果
2012-10-20 17:26 13871,三星通讯录滑动触发开关 你可以参考: http://gja ... -
android水波纹效果之一
2012-09-17 22:27 1184参考: http://www.apkbus.com/archi ... -
android桌面预览效果
2012-09-17 21:49 974主要改动的是:workspace.Java和launcher. ... -
Android 自定义滚动视图
2012-08-24 22:39 569MainActivity package org. ... -
实现通讯录的弹窗效果
2012-08-19 22:06 1768参考http://www.cnblogs.com/noTice ... -
【原创】android ViewPager控件的使用
2012-06-15 10:33 2390android4.0有个控件,就是viewpager,用来实现 ... -
【原创】android 实现气泡式listview
2012-06-14 13:33 1974iphone中短信聊天都是那种气泡式的,当然,android短 ... -
【原创】android中实现底部tabhost
2012-06-14 10:14 1741这个主要是实现底部的tabhost方式,tabhost就是有几 ... -
【原创】android中定义BaseActivity
2012-06-13 12:53 5646[size=medium] 需求: 如果一个应用程序中有许多a ... -
【原创】android进入应用程序时的动画实现
2012-06-12 11:34 1450相信玩过android应用的同学都看过进入应用程序时出现的短暂 ... -
【原创】android仿ucweb的菜单效果
2012-06-12 11:12 1155[size=medium]先看一张图 这里有几个要点 1,主 ... -
【原创】android2.3如何加入对wml的支持
2012-06-12 09:52 1307其实就是改makefile文件: 1,开启宏定义: 在exte ... -
【原创】dip与px
2012-06-11 10:38 872真正要做适配的,只有是当图片被拉抻后,是否变形了,如果变形了, ... -
【原创】Android aidl实现两个apk之间远程调用Service
2012-06-07 11:12 4969Aidl,android平台的IPC方式之一,基于系统的Ibi ... -
【转】Android-Action Bar使用方法
2012-06-06 14:49 1823转自http://disanji.net/2011/02/24 ... -
【原创】Android仿新浪微博的“更多”页面效果
2012-05-29 17:38 2240看到新浪微博那个“更多”页面的效果,感觉不错,所以拿来模仿一下 ... -
【原创】Android 设置Dialog的长宽和位置
2012-05-28 10:11 2720在Dialog调用show方法之后,加上以下代码: Wi ... -
【原创】Android 实现微博分享功能
2012-05-27 22:20 1468通过发送下面的intent: Intent intent = ...
相关推荐
"LauncherEx"可能是一个特定的第三方Android Launcher应用,旨在模仿Mac的Dock设计。此应用可能会有以下特性: 1. **Dock栏**:在屏幕底部,像Mac一样显示常驻应用的图标,用户可以自定义这些图标。 2. **动画效果**...
"Android 仿Mac的Dock.zip"是一个针对这一需求的解决方案,它旨在为Android设备带来类似MacOS的操作体验,尤其是其标志性的Dock功能。Dock在MacOS中是用于快速启动应用程序、切换任务和组织常用应用的工具栏。这个...
仿小米电视桌面launcher源码Demo,改桌面采用 类似小米一样的metro风格的 设计,可以通过远程配置控制桌面显示 的内容,非常棒,成功用于多个机顶盒ott项目。无积分或者不想登陆点我头像发给你。
Android Launcher 是 Android 系统中一个非常重要的组件,负责显示桌面程序和管理应用程序图标。了解 Launcher 的源码可以帮助我们更好地理解 Android 系统的设计思想和实现机制。本文将对 Launcher 的源码进行深入...
在Android系统中,Launcher是用户界面的一个重要组成部分,它提供了应用程序的启动图标和小部件(Widgets)等元素,使得用户可以方便地访问和管理手机上的应用。本篇将深入探讨如何在自定义的Launcher中添加Widget,...
【标题】"安卓Android源码——仿Mac的Dock.zip" 提供的是一个关于在Android平台上实现类似Mac操作系统Dock栏功能的源代码项目。Dock栏在操作系统中起着至关重要的作用,它提供了一种便捷的方式,让用户可以快速访问...
在Android应用开发中,"高仿小米launcher(ZAKER)跨屏拖动"是一个常见的实践,旨在为用户提供类似小米手机启动器或ZAKER新闻应用那样的交互体验。这份源码提供了实现这一功能的详细步骤和代码,对于想要深入理解...
本压缩包"安卓Android源码——高仿小米launcher(ZAKER)跨屏拖动item.zip"提供了对小米Launcher(ZAKER风格)跨屏拖动item功能的实现,这对于开发者来说是一个宝贵的资源,可以帮助他们学习如何构建类似的应用启动器...
**Android Launcher3源码详解** Android系统的桌面启动器(Launcher)是用户与设备交互的核心界面,它负责展示应用快捷方式、小部件以及主屏幕布局。其中,`Launcher3`是Android开源项目AOSP(Android Open Source ...
源码是了解一个软件工作原理的最直接途径,对于开发者来说,能够访问并理解Android源码,有助于他们优化应用性能,解决兼容性问题,以及开发独特的功能。 【文件名解析】 DisplayAudioTheme,这个文件名可能是项目...
在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2(Froyo)版本的Launcher源码。 1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、...
【Android项目源码-安卓Launcher原生桌面源码】是一个深入了解Android系统启动器(Launcher)工作原理的重要资源。源码提供了Android操作系统中的主屏幕和应用抽屉的实现细节,这对于Android开发者尤其是系统定制者...
1. **Dock栏**:仿照Mac OS中的Dock栏,"win7仿Mac Launcher"会在屏幕底部创建一个类似的条目,用户可以将常用的程序图标添加到其中。点击图标即可启动程序,同时,运行中的应用会显示活动状态,如闪烁的图标,以...
为了修改和编译Android Launcher源码,你需要一个完整的Android开发环境,包括安装了Android SDK、Android Studio和必要的工具链。以下是一般步骤: 1. **导入项目**:在Android Studio中打开源码目录,通过"File" ...
"rk_launcher模拟苹果dock"是一款专为用户打造的桌面插件,旨在为非苹果设备提供类似苹果MacOS系统中的Dock栏体验。这款小巧且美观的工具,能够让你的Windows或其他非苹果操作系统拥有苹果风格的底部任务栏,提升...
【Android源码——仿Mac的Dock.zip】是一个包含Android源代码的压缩包,其目标是实现一个类似于Mac操作系统的Dock栏效果。Dock栏在Mac OS中是一个重要的界面元素,它位于屏幕底部,显示常用的应用程序图标,用户可以...
Android 8.0(代号Oreo)是Google推出的Android操作系统的一个重大版本,它引入了许多改进和新特性。其中,Launcher3是Android系统的核心组件之一,它是用户与设备交互的主要界面,负责显示和管理应用程序图标、小...
《Android 2.2原生Launcher源码解析》 Android系统中的Launcher,即启动器,是用户与系统交互的首要界面,它负责...同时,源码学习也能提升我们对Android系统整体框架的理解,有助于成为一个更出色的Android开发者。
本项目聚焦于一个特定的主题:“高仿小米Launcher跨屏拖动”的源码分析,这对于深入理解Android Launcher的工作原理以及自定义启动器的开发具有很高的学习价值。 首先,我们要理解什么是跨屏拖动。在传统的Android ...
1.适用android 盒子,1920*1080(密度240),1280*720(密度160),1280*720(密度...3,主页功能介绍(第一排,左边语音调起,右边时间,第二排,常用国外视频app,第三排所有apps,第四排设置,以太网,wifi 网络标识)