android launcher 文件夹美化类似小米Launcher
2016-05-16 14:20
435 查看
原生自带的桌面文件夹样式及其简单,没有iphone那种可以显示文件夹内文件图标缩略图的功能,今天我们来简单的实现一个。
效果如下:
从launcher源码中很容易变可以看出需要修改的文件,主要修改FolderIcon.Java这个文件。修改后的代码如下:
[java]
view plain
copy
print?
public class FolderIcon extends BubbleTextView implements DropTarget {
private UserFolderInfo mInfo;
private Launcher mLauncher;
private Drawable mCloseIcon;
private Drawable mOpenIcon;
// add by hmg for FolderIcon {
private IconCache mIconCache;
private static final int ICON_COUNT = 4; //可显示的缩略图数
private static final int NUM_COL = 2; // 每行显示的个数
private static final int PADDING = 1; //内边距
private static final int MARGIN = 7; //外边距
// add by hmg for FolderIcon }
public FolderIcon(Context context, AttributeSet attrs) {
super(context, attrs);
mIconCache = ((LauncherApplication) mContext.getApplicationContext())
.getIconCache();
}
public FolderIcon(Context context) {
super(context);
mIconCache = ((LauncherApplication) mContext.getApplicationContext())
.getIconCache();
}
static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group,
UserFolderInfo folderInfo) {
FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(
resId, group, false);
// final Resources resources = launcher.getResources();
// Drawable d = resources.getDrawable(R.drawable.ic_launcher_folder);
// icon.mCloseIcon = d;
// icon.mOpenIcon =
// resources.getDrawable(R.drawable.ic_launcher_folder_open);
// icon.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);
icon.setText(folderInfo.title);
icon.setTag(folderInfo);
icon.setOnClickListener(launcher);
icon.mInfo = folderInfo;
icon.mLauncher = launcher;
icon.updateFolderIcon(); //更新图标
folderInfo.setFolderIcon(icon); //设置FolderIcon
return icon;
}
// add by hmg25 for FolderIcon {
/**
* Author : hmg25 Version: 1.0 Description : 更新FolderIcon显示的文件缩略图
*/
public void updateFolderIcon() {
float x, y;
final Resources resources = mLauncher.getResources();
Bitmap closebmp = BitmapFactory.decodeResource(resources,
R.drawable.icon_folder); //获取FolderIcon关闭时的背景图
Bitmap openbmp = BitmapFactory.decodeResource(resources,
R.drawable.icon_folder_open); //获取FolderIcon打开时的背景图
int iconWidth = closebmp.getWidth(); //icon的宽度
int iconHeight = closebmp.getHeight();
Bitmap folderclose = Bitmap.createBitmap(iconWidth, iconHeight,
Bitmap.Config.ARGB_8888);
Bitmap folderopen = Bitmap.createBitmap(iconWidth, iconHeight,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(folderclose);
canvas.drawBitmap(closebmp, 0, 0, null); //绘制背景
Matrix matrix = new Matrix(); // 创建操作图片用的Matrix对象
float scaleWidth = (iconWidth - MARGIN * 2) / NUM_COL - 2 * PADDING; //计算缩略图的宽(高与宽相同)
float scale = (scaleWidth / iconWidth); // 计算缩放比例
matrix.postScale(scale, scale); // 设置缩放比例
for (int i = 0; i < ICON_COUNT; i++) {
if (i < mInfo.contents.size()) {
x = MARGIN + PADDING * (2 * (i % NUM_COL) + 1) + scaleWidth
* (i % NUM_COL);
y = MARGIN + PADDING * (2 * (i / NUM_COL) + 1) + scaleWidth
* (i / NUM_COL);
ShortcutInfo scInfo = (ShortcutInfo) mInfo.contents.get(i);
Bitmap iconbmp = scInfo.getIcon(mIconCache); //获取缩略图标
Bitmap scalebmp = Bitmap.createBitmap(iconbmp, 0, 0, iconWidth,
iconHeight, matrix, true);
canvas.drawBitmap(scalebmp, x, y, null);
}
}
mCloseIcon = new FastBitmapDrawable(folderclose); //将bitmap转换为Drawable
setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
canvas = new Canvas(folderopen);
canvas.drawBitmap(folderclose, 0, 0, null);
canvas.drawBitmap(openbmp, 0, 0, null);
mOpenIcon = new FastBitmapDrawable(folderopen); //绘制open图片
}
// add by hmg25 for FolderIcon }
public boolean acceptDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
final ItemInfo item = (ItemInfo) dragInfo;
final int itemType = item.itemType;
return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT)
&& item.<a href="http://lib.csdn.net/base/4" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a> != mInfo.id;
}
public Rect estimateDropLocation(DragSource source, int x, int y,
int xOffset, int yOffset, DragView dragView, Object dragInfo,
Rect recycle) {
return null;
}
public void onDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
ShortcutInfo item;
if (dragInfo instanceof ApplicationInfo) {
// Came from all apps -- make a copy
item = ((ApplicationInfo) dragInfo).makeShortcut();
} else {
item = (ShortcutInfo) dragInfo;
}
mInfo.add(item);
LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0,
0);
updateFolderIcon(); //拖拽放入时更新
}
public void onDragEnter(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);
}
public void onDragOver(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
}
public void onDragExit(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
}
}
将文件拖拽进入文件夹时响应FolderIcon中的onDrop,所以添加updateFolderIcon();
以上代码可以实现将图标拖拽进文件夹时实时更新缩略图显示,还没有对拖拽出文件夹时更新显示,所以还需要修改其他地方。跟踪代码可以看出拖拽离开文件夹时响应UserFolder中方法onDropCompleted,需要修改UserFolder.java:
[java]
view plain
copy
print?
public void onDropCompleted(View target, boolean success) {
if (success) {
ShortcutsAdapter adapter = (ShortcutsAdapter)mContent.getAdapter();
adapter.remove(mDragItem);
((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 拖拽离开时更新
}
}
ublic void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
DragView dragView, Object dragInfo) {
ShortcutInfo item;
if (dragInfo instanceof ApplicationInfo) {
// Came from all apps -- make a copy
item = ((ApplicationInfo)dragInfo).makeShortcut();
} else {
item = (ShortcutInfo)dragInfo;
}
((ShortcutsAdapter)mContent.getAdapter()).add(item);
LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0);
((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 将文件直接拖拽到打开的文件夹更新
从以上代码可以看出为了传递FolderIcon对象,所以我们还需要为UserFolderInfo添加一个mFolderIcon成员,修改UserFolderInfo.java:
[java]
view plain
copy
print?
protected FolderIcon mFolderIcon = null; //add by hmg25 for Folder
//add by hmg25 for Folder {
void setFolderIcon(FolderIcon icon)
{
mFolderIcon=icon;
}
//add by hmg25 for Folder }
以上代码是在android2.2,480*320下测试的,其他分辨率的可以修改
private static final int ICON_COUNT = 4; //可显示的缩略图数
privatestatic final int NUM_COL = 2; // 每行显示的个数
privatestatic final int PADDING = 1; //内边距
privatestatic final int MARGIN = 7; //外边距
的值。
效果如下:
从launcher源码中很容易变可以看出需要修改的文件,主要修改FolderIcon.Java这个文件。修改后的代码如下:
[java]
view plain
copy
print?
public class FolderIcon extends BubbleTextView implements DropTarget {
private UserFolderInfo mInfo;
private Launcher mLauncher;
private Drawable mCloseIcon;
private Drawable mOpenIcon;
// add by hmg for FolderIcon {
private IconCache mIconCache;
private static final int ICON_COUNT = 4; //可显示的缩略图数
private static final int NUM_COL = 2; // 每行显示的个数
private static final int PADDING = 1; //内边距
private static final int MARGIN = 7; //外边距
// add by hmg for FolderIcon }
public FolderIcon(Context context, AttributeSet attrs) {
super(context, attrs);
mIconCache = ((LauncherApplication) mContext.getApplicationContext())
.getIconCache();
}
public FolderIcon(Context context) {
super(context);
mIconCache = ((LauncherApplication) mContext.getApplicationContext())
.getIconCache();
}
static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group,
UserFolderInfo folderInfo) {
FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(
resId, group, false);
// final Resources resources = launcher.getResources();
// Drawable d = resources.getDrawable(R.drawable.ic_launcher_folder);
// icon.mCloseIcon = d;
// icon.mOpenIcon =
// resources.getDrawable(R.drawable.ic_launcher_folder_open);
// icon.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);
icon.setText(folderInfo.title);
icon.setTag(folderInfo);
icon.setOnClickListener(launcher);
icon.mInfo = folderInfo;
icon.mLauncher = launcher;
icon.updateFolderIcon(); //更新图标
folderInfo.setFolderIcon(icon); //设置FolderIcon
return icon;
}
// add by hmg25 for FolderIcon {
/**
* Author : hmg25 Version: 1.0 Description : 更新FolderIcon显示的文件缩略图
*/
public void updateFolderIcon() {
float x, y;
final Resources resources = mLauncher.getResources();
Bitmap closebmp = BitmapFactory.decodeResource(resources,
R.drawable.icon_folder); //获取FolderIcon关闭时的背景图
Bitmap openbmp = BitmapFactory.decodeResource(resources,
R.drawable.icon_folder_open); //获取FolderIcon打开时的背景图
int iconWidth = closebmp.getWidth(); //icon的宽度
int iconHeight = closebmp.getHeight();
Bitmap folderclose = Bitmap.createBitmap(iconWidth, iconHeight,
Bitmap.Config.ARGB_8888);
Bitmap folderopen = Bitmap.createBitmap(iconWidth, iconHeight,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(folderclose);
canvas.drawBitmap(closebmp, 0, 0, null); //绘制背景
Matrix matrix = new Matrix(); // 创建操作图片用的Matrix对象
float scaleWidth = (iconWidth - MARGIN * 2) / NUM_COL - 2 * PADDING; //计算缩略图的宽(高与宽相同)
float scale = (scaleWidth / iconWidth); // 计算缩放比例
matrix.postScale(scale, scale); // 设置缩放比例
for (int i = 0; i < ICON_COUNT; i++) {
if (i < mInfo.contents.size()) {
x = MARGIN + PADDING * (2 * (i % NUM_COL) + 1) + scaleWidth
* (i % NUM_COL);
y = MARGIN + PADDING * (2 * (i / NUM_COL) + 1) + scaleWidth
* (i / NUM_COL);
ShortcutInfo scInfo = (ShortcutInfo) mInfo.contents.get(i);
Bitmap iconbmp = scInfo.getIcon(mIconCache); //获取缩略图标
Bitmap scalebmp = Bitmap.createBitmap(iconbmp, 0, 0, iconWidth,
iconHeight, matrix, true);
canvas.drawBitmap(scalebmp, x, y, null);
}
}
mCloseIcon = new FastBitmapDrawable(folderclose); //将bitmap转换为Drawable
setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
canvas = new Canvas(folderopen);
canvas.drawBitmap(folderclose, 0, 0, null);
canvas.drawBitmap(openbmp, 0, 0, null);
mOpenIcon = new FastBitmapDrawable(folderopen); //绘制open图片
}
// add by hmg25 for FolderIcon }
public boolean acceptDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
final ItemInfo item = (ItemInfo) dragInfo;
final int itemType = item.itemType;
return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT)
&& item.<a href="http://lib.csdn.net/base/4" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a> != mInfo.id;
}
public Rect estimateDropLocation(DragSource source, int x, int y,
int xOffset, int yOffset, DragView dragView, Object dragInfo,
Rect recycle) {
return null;
}
public void onDrop(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
ShortcutInfo item;
if (dragInfo instanceof ApplicationInfo) {
// Came from all apps -- make a copy
item = ((ApplicationInfo) dragInfo).makeShortcut();
} else {
item = (ShortcutInfo) dragInfo;
}
mInfo.add(item);
LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0,
0);
updateFolderIcon(); //拖拽放入时更新
}
public void onDragEnter(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);
}
public void onDragOver(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
}
public void onDragExit(DragSource source, int x, int y, int xOffset,
int yOffset, DragView dragView, Object dragInfo) {
setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
}
}
将文件拖拽进入文件夹时响应FolderIcon中的onDrop,所以添加updateFolderIcon();
以上代码可以实现将图标拖拽进文件夹时实时更新缩略图显示,还没有对拖拽出文件夹时更新显示,所以还需要修改其他地方。跟踪代码可以看出拖拽离开文件夹时响应UserFolder中方法onDropCompleted,需要修改UserFolder.java:
[java]
view plain
copy
print?
public void onDropCompleted(View target, boolean success) {
if (success) {
ShortcutsAdapter adapter = (ShortcutsAdapter)mContent.getAdapter();
adapter.remove(mDragItem);
((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 拖拽离开时更新
}
}
ublic void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
DragView dragView, Object dragInfo) {
ShortcutInfo item;
if (dragInfo instanceof ApplicationInfo) {
// Came from all apps -- make a copy
item = ((ApplicationInfo)dragInfo).makeShortcut();
} else {
item = (ShortcutInfo)dragInfo;
}
((ShortcutsAdapter)mContent.getAdapter()).add(item);
LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0);
((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 将文件直接拖拽到打开的文件夹更新
从以上代码可以看出为了传递FolderIcon对象,所以我们还需要为UserFolderInfo添加一个mFolderIcon成员,修改UserFolderInfo.java:
[java]
view plain
copy
print?
protected FolderIcon mFolderIcon = null; //add by hmg25 for Folder
//add by hmg25 for Folder {
void setFolderIcon(FolderIcon icon)
{
mFolderIcon=icon;
}
//add by hmg25 for Folder }
以上代码是在android2.2,480*320下测试的,其他分辨率的可以修改
private static final int ICON_COUNT = 4; //可显示的缩略图数
privatestatic final int NUM_COL = 2; // 每行显示的个数
privatestatic final int PADDING = 1; //内边距
privatestatic final int MARGIN = 7; //外边距
的值。
相关文章推荐
- 安卓开发中Gallery控件的使用
- Java、Android中Math类中常用方法的简单介绍
- 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- Failed to find 'ANDROID_HOME' environment variable
- Android Button按钮点击背景和文字变化
- android 输入法弹出键盘把listview顶上去,保留顶部标题栏位置不动
- Android Studio添加assets文件夹
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- Android Studio你不知道的调试技巧
- android 进入页面时让焦点固定在顶部
- android 开发奇葩问题
- Android 打开URL
- 解决Android输入法不隐藏的问题
- Android手势锁实现
- Android官方文档之Content Providers
- Android开机启动耗时较多的部分有3个,分别是preloadclasses和scan packages。//preload-resources
- Android基础之listview多种布局
- Android ScrollView listview 自定义listview导致低配置手机卡死现象
- Android ButterKnife注入框架 使用
- 【Android 基础】Google新推出的Android布局控件FlexboxLayout