日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 桌面文件夹ui美化

發布時間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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美化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。