生活随笔
收集整理的這篇文章主要介紹了
android 桌面文件夹ui美化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/hmg25/article/details/6574575
?? ?android原生自帶的桌面文件夾樣式及其簡單,沒有iphone那種可以顯示文件夾內文件圖標縮略圖的功能,今天我們來簡單的實現一個。
效果如下:
?
從launcher源碼中很容易變可以看出需要修改的文件,主要修改FolderIcon.java這個文件。修改后的代碼如下:
view plain
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.container?!=?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:
view plain
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:
?
view plain
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;??//可顯示的縮略圖數
????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美化的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。