http://blog.csdn.net/hmg25/article/details/6574575

android原生自带的桌面文件夹样式及其简单,没有iphone那种可以显示文件夹内文件图标缩略图的功能,今天我们来简单的实现一个。

效果如下:

从launcher源码中很容易变可以看出需要修改的文件,主要修改FolderIcon.java这个文件。修改后的代码如下:

view plain
  1. public class FolderIcon extends BubbleTextView implements DropTarget {
  2. private UserFolderInfo mInfo;
  3. private Launcher mLauncher;
  4. private Drawable mCloseIcon;
  5. private Drawable mOpenIcon;
  6. // add by hmg for FolderIcon {
  7. private IconCache mIconCache;
  8. private static final int ICON_COUNT = 4;  //可显示的缩略图数
  9. private static final int NUM_COL = 2;    // 每行显示的个数
  10. private static final int PADDING = 1;    //内边距
  11. private static final int MARGIN = 7;     //外边距
  12. // add by hmg for FolderIcon }
  13. public FolderIcon(Context context, AttributeSet attrs) {
  14. super(context, attrs);
  15. mIconCache = ((LauncherApplication) mContext.getApplicationContext())
  16. .getIconCache();
  17. }
  18. public FolderIcon(Context context) {
  19. super(context);
  20. mIconCache = ((LauncherApplication) mContext.getApplicationContext())
  21. .getIconCache();
  22. }
  23. static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group,
  24. UserFolderInfo folderInfo) {
  25. FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(
  26. resId, group, false);
  27. // final Resources resources = launcher.getResources();
  28. // Drawable d = resources.getDrawable(R.drawable.ic_launcher_folder);
  29. // icon.mCloseIcon = d;
  30. // icon.mOpenIcon =
  31. // resources.getDrawable(R.drawable.ic_launcher_folder_open);
  32. // icon.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);
  33. icon.setText(folderInfo.title);
  34. icon.setTag(folderInfo);
  35. icon.setOnClickListener(launcher);
  36. icon.mInfo = folderInfo;
  37. icon.mLauncher = launcher;
  38. icon.updateFolderIcon();   //更新图标
  39. folderInfo.setFolderIcon(icon); //设置FolderIcon
  40. return icon;
  41. }
  42. // add by hmg25 for  FolderIcon {
  43. /**
  44. * Author : hmg25 Version: 1.0 Description : 更新FolderIcon显示的文件缩略图
  45. */
  46. public void updateFolderIcon() {
  47. float x, y;
  48. final Resources resources = mLauncher.getResources();
  49. Bitmap closebmp = BitmapFactory.decodeResource(resources,
  50. R.drawable.icon_folder);   //获取FolderIcon关闭时的背景图
  51. Bitmap openbmp = BitmapFactory.decodeResource(resources,
  52. R.drawable.icon_folder_open); //获取FolderIcon打开时的背景图
  53. int iconWidth = closebmp.getWidth();  //icon的宽度
  54. int iconHeight = closebmp.getHeight();
  55. Bitmap folderclose = Bitmap.createBitmap(iconWidth, iconHeight,
  56. Bitmap.Config.ARGB_8888);
  57. Bitmap folderopen = Bitmap.createBitmap(iconWidth, iconHeight,
  58. Bitmap.Config.ARGB_8888);
  59. Canvas canvas = new Canvas(folderclose);
  60. canvas.drawBitmap(closebmp, 0, 0, null);  //绘制背景
  61. Matrix matrix = new Matrix(); // 创建操作图片用的Matrix对象
  62. float scaleWidth = (iconWidth - MARGIN * 2) / NUM_COL - 2 * PADDING;  //计算缩略图的宽(高与宽相同)
  63. float scale = (scaleWidth / iconWidth); // 计算缩放比例
  64. matrix.postScale(scale, scale);    // 设置缩放比例
  65. for (int i = 0; i < ICON_COUNT; i++) {
  66. if (i < mInfo.contents.size()) {
  67. x = MARGIN + PADDING * (2 * (i % NUM_COL) + 1) + scaleWidth
  68. * (i % NUM_COL);
  69. y = MARGIN + PADDING * (2 * (i / NUM_COL) + 1) + scaleWidth
  70. * (i / NUM_COL);
  71. ShortcutInfo scInfo = (ShortcutInfo) mInfo.contents.get(i);
  72. Bitmap iconbmp = scInfo.getIcon(mIconCache);      //获取缩略图标
  73. Bitmap scalebmp = Bitmap.createBitmap(iconbmp, 0, 0, iconWidth,
  74. iconHeight, matrix, true);
  75. canvas.drawBitmap(scalebmp, x, y, null);
  76. }
  77. }
  78. mCloseIcon = new FastBitmapDrawable(folderclose);  //将bitmap转换为Drawable
  79. setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
  80. canvas = new Canvas(folderopen);
  81. canvas.drawBitmap(folderclose, 0, 0, null);
  82. canvas.drawBitmap(openbmp, 0, 0, null);
  83. mOpenIcon = new FastBitmapDrawable(folderopen);  //绘制open图片
  84. }
  85. // add by hmg25 for  FolderIcon }
  86. public boolean acceptDrop(DragSource source, int x, int y, int xOffset,
  87. int yOffset, DragView dragView, Object dragInfo) {
  88. final ItemInfo item = (ItemInfo) dragInfo;
  89. final int itemType = item.itemType;
  90. return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT)
  91. && item.container != mInfo.id;
  92. }
  93. public Rect estimateDropLocation(DragSource source, int x, int y,
  94. int xOffset, int yOffset, DragView dragView, Object dragInfo,
  95. Rect recycle) {
  96. return null;
  97. }
  98. public void onDrop(DragSource source, int x, int y, int xOffset,
  99. int yOffset, DragView dragView, Object dragInfo) {
  100. ShortcutInfo item;
  101. if (dragInfo instanceof ApplicationInfo) {
  102. // Came from all apps -- make a copy
  103. item = ((ApplicationInfo) dragInfo).makeShortcut();
  104. } else {
  105. item = (ShortcutInfo) dragInfo;
  106. }
  107. mInfo.add(item);
  108. LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0,
  109. 0);
  110. updateFolderIcon();  //拖拽放入时更新
  111. }
  112. public void onDragEnter(DragSource source, int x, int y, int xOffset,
  113. int yOffset, DragView dragView, Object dragInfo) {
  114. setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);
  115. }
  116. public void onDragOver(DragSource source, int x, int y, int xOffset,
  117. int yOffset, DragView dragView, Object dragInfo) {
  118. }
  119. public void onDragExit(DragSource source, int x, int y, int xOffset,
  120. int yOffset, DragView dragView, Object dragInfo) {
  121. setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
  122. }
  123. }

将文件拖拽进入文件夹时响应FolderIcon中的onDrop,所以添加updateFolderIcon();

以上代码可以实现将图标拖拽进文件夹时实时更新缩略图显示,还没有对拖拽出文件夹时更新显示,所以还需要修改其他地方。跟踪代码可以看出拖拽离开文件夹时响应UserFolder中方法onDropCompleted,需要修改UserFolder.java:

view plain
  1. public void onDropCompleted(View target, boolean success) {
  2. if (success) {
  3. ShortcutsAdapter adapter = (ShortcutsAdapter)mContent.getAdapter();
  4. adapter.remove(mDragItem);
  5. ((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon();  //add by hmg25 拖拽离开时更新
  6. }
  7. }
  8. ublic void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
  9. DragView dragView, Object dragInfo) {
  10. ShortcutInfo item;
  11. if (dragInfo instanceof ApplicationInfo) {
  12. // Came from all apps -- make a copy
  13. item = ((ApplicationInfo)dragInfo).makeShortcut();
  14. } else {
  15. item = (ShortcutInfo)dragInfo;
  16. }
  17. ((ShortcutsAdapter)mContent.getAdapter()).add(item);
  18. LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0);
  19. ((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25  将文件直接拖拽到打开的文件夹更新

从以上代码可以看出为了传递FolderIcon对象,所以我们还需要为UserFolderInfo添加一个mFolderIcon成员,修改UserFolderInfo.java:

view plain
  1. protected FolderIcon mFolderIcon = null; //add by hmg25 for Folder
  2. //add by hmg25 for Folder {
  3. void setFolderIcon(FolderIcon icon)
  4. {
  5. mFolderIcon=icon;
  6. }
  7. //add by hmg25 for Folder }

以上代码是在android2.2, 480*320下测试的,其他分辨率的可以修改

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;     //外边距

的值。

转载于:https://www.cnblogs.com/greywolf/archive/2012/12/24/2831236.html

android 桌面文件夹ui美化相关推荐

  1. android桌面文件夹美化

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 哈哈,好久没有写博客拉,blog里边好凄凉阿~~人也变懒了-- android原生自带的桌面文件夹样式及其简单,没 ...

  2. android桌面文件夹,打造清新手机桌面 5款安卓桌面文件夹合辑推荐

    亲爱的童鞋们,你是否每次面对桌面上凌乱的软件都感到无奈呢?你是否每次看到安卓自带文件夹那单一的图标都感到一阵索然无味呢?你是否仍在苦苦寻求解决之道呢?其实,只要安装一款第三方桌面文件夹,一切问题将迎刃 ...

  3. android+桌面文件夹动画,Android动画

    1.为什么要说动画? 动画的适用是Android开发常用的知识 种类繁多,适用复杂,很多实现需要自定义动画 2.目前Android中有多少种动画? 视图动画(View 动画) 属性动画 揭露动画(Re ...

  4. Android UI美化基本

    这一篇先给大家介绍最基本的UI美化知识,下一篇给大家上一个实例: <?xml version="1.0" encoding="utf-8"?> &l ...

  5. 怎么给win7电脑桌面文件夹加密-兄弟连IT教育

    怎么给win7电脑桌面文件夹加密-兄弟连IT教育 平时我们都习惯在电脑桌面上放置一些常用的软件工具,还会将一些日常办公会用到的文件资料,存放在桌面文件夹内.这样确实可以方便日常办公查找与使用,但是这些 ...

  6. android 界面组件,安卓开发学习周第三篇——Android中的UI组件

    原标题:安卓开发学习周第三篇--Android中的UI组件 在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的.View是绘制在屏幕上的用户能与之交互的一个对 ...

  7. Android ROM定制——界面美化基础

    Android ROM定制--界面美化基础 前言:很多童鞋对美化很感兴趣,都想拥有一个完完全全属于自己风格的手机系统!对那些自定义全局背景,1%电量显示,透明下拉菜单...都很感冒!美化的重点跟难点就 ...

  8. android隐藏系统ui_如何在非库存设备上获取Android的系统UI调谐器

    android隐藏系统ui One benefit users of stock Android devices have had for the past few iterations of the ...

  9. Android阿拉伯语UI适配问题汇总

    Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...

最新文章

  1. 通过SID查找历史执行的SQL语句
  2. python中文什么意思-python中class是什么意思
  3. Warning: bind(): React component methods may only be bound to the component instance. See ...
  4. python3 mysql库_Python3.7 MySQL 数据库连接
  5. 【Spark Summit EU 2016】沃森媒体分析系统:从单租户Hadoop到3000租户Spark的架构演进...
  6. Android 内部存储安装apk文件实现
  7. 驱动开发遇到version magic不匹配
  8. mysql replace into 异常1365 - Division by 0
  9. 简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping
  10. 游戏模型与影视模型在制作上的区别,以及分别都用什么三维软件最多
  11. 阿里云盘和 Teambition 网盘
  12. bin/hive出错:Exception in thread main java.lang.RuntimeException: java.net.ConnectException: Call Fr
  13. 在qt中使用opengl绘制图形动画
  14. MOSFET与MOSFET驱动电路原理及应用
  15. 用Python读取照片拍摄的详细信息(拍摄时间、地址等)
  16. (三)Kotlin加密/解密之AES和DES
  17. 《最高人民法院 最高人民检察院 公安部关于办理电信网络诈骗等刑事案件适用法律若干问题的意见(二)》
  18. js如何实现重定当前向页面并刷新?
  19. H5页面(八)常见的问题二------填坑
  20. java线程池的简单使用

热门文章

  1. 【AI-1000问】为什么CNN中的卷积核半径都是奇数?
  2. 【数据】深度学习从“数据集”开始
  3. Lazada代运营怎么样?需不需要找?如何选择一家靠谱的公司
  4. 全球及中国洗发护发市场品牌营销调研与投资竞争策略研究报告2022版
  5. HTML实现包含公共部分:通过ECMA6的模块化,纯前端实现类似jsp:include的功能
  6. Python 33(1) UDP协议 数据报协议 socketsever模块
  7. 基本HTTP协议流程是什么?
  8. switch case 判断是否为按钮、设置属性 Load Foreach 绑定事件
  9. EXCLE使用中常用函数和公式
  10. 将DevExpress.Utils.ImageCollection变量的image导出