android案頭檔案夾美化

來源:互聯網
上載者:User

                          By 何明桂(http://blog.csdn.net/hmg25) 轉載請註明出處 

 

    哈哈,好久沒有寫部落格拉,blog裡邊好淒涼阿~~人也變懶了……

    android原生內建的案頭檔案夾樣式及其簡單,沒有iphone那種可以顯示檔案夾內檔案表徵圖縮圖的功能,今天我們來簡單的實現一個。

效果如下:

 

從launcher源碼中很容易變可以看出需要修改的檔案,主要修改FolderIcon.java這個檔案。修改後的代碼如下:

public class FolderIcon extends BubbleTextView implements DropTarget {<br />private UserFolderInfo mInfo;<br />private Launcher mLauncher;<br />private Drawable mCloseIcon;<br />private Drawable mOpenIcon;<br />// add by hmg for FolderIcon {<br />private IconCache mIconCache;<br />private static final int ICON_COUNT = 4; //可顯示的縮圖數<br />private static final int NUM_COL = 2; // 每行顯示的個數<br />private static final int PADDING = 1; //內邊距<br />private static final int MARGIN = 7; //外邊距<br />// add by hmg for FolderIcon }<br />public FolderIcon(Context context, AttributeSet attrs) {<br />super(context, attrs);<br />mIconCache = ((LauncherApplication) mContext.getApplicationContext())<br />.getIconCache();<br />}<br />public FolderIcon(Context context) {<br />super(context);<br />mIconCache = ((LauncherApplication) mContext.getApplicationContext())<br />.getIconCache();<br />}<br />static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group,<br />UserFolderInfo folderInfo) {<br />FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(<br />resId, group, false);<br />// final Resources resources = launcher.getResources();<br />// Drawable d = resources.getDrawable(R.drawable.ic_launcher_folder);<br />// icon.mCloseIcon = d;<br />// icon.mOpenIcon =<br />// resources.getDrawable(R.drawable.ic_launcher_folder_open);<br />// icon.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);<br />icon.setText(folderInfo.title);<br />icon.setTag(folderInfo);<br />icon.setOnClickListener(launcher);<br />icon.mInfo = folderInfo;<br />icon.mLauncher = launcher; </p><p>icon.updateFolderIcon(); //更新表徵圖<br />folderInfo.setFolderIcon(icon); //設定FolderIcon<br />return icon;<br />}<br />// add by hmg25 for FolderIcon {<br />/**<br /> * Author : hmg25 Version: 1.0 Description : 更新FolderIcon顯示的檔案縮圖<br /> */<br />public void updateFolderIcon() {<br />float x, y;<br />final Resources resources = mLauncher.getResources();<br />Bitmap closebmp = BitmapFactory.decodeResource(resources,<br />R.drawable.icon_folder); //擷取FolderIcon關閉時的背景圖<br />Bitmap openbmp = BitmapFactory.decodeResource(resources,<br />R.drawable.icon_folder_open); //擷取FolderIcon開啟時的背景圖</p><p>int iconWidth = closebmp.getWidth(); //icon的寬度<br />int iconHeight = closebmp.getHeight();<br />Bitmap folderclose = Bitmap.createBitmap(iconWidth, iconHeight,<br />Bitmap.Config.ARGB_8888);<br />Bitmap folderopen = Bitmap.createBitmap(iconWidth, iconHeight,<br />Bitmap.Config.ARGB_8888);<br />Canvas canvas = new Canvas(folderclose);<br />canvas.drawBitmap(closebmp, 0, 0, null); //繪製背景<br />Matrix matrix = new Matrix(); // 建立操作圖片用的Matrix對象<br />float scaleWidth = (iconWidth - MARGIN * 2) / NUM_COL - 2 * PADDING; //計算縮圖的寬(高與寬相同)<br />float scale = (scaleWidth / iconWidth); // 計算縮放比例<br />matrix.postScale(scale, scale); // 設定縮放比例<br />for (int i = 0; i < ICON_COUNT; i++) {<br />if (i < mInfo.contents.size()) {<br />x = MARGIN + PADDING * (2 * (i % NUM_COL) + 1) + scaleWidth<br />* (i % NUM_COL);<br />y = MARGIN + PADDING * (2 * (i / NUM_COL) + 1) + scaleWidth<br />* (i / NUM_COL);<br />ShortcutInfo scInfo = (ShortcutInfo) mInfo.contents.get(i);<br />Bitmap iconbmp = scInfo.getIcon(mIconCache); //擷取縮圖標<br />Bitmap scalebmp = Bitmap.createBitmap(iconbmp, 0, 0, iconWidth,<br />iconHeight, matrix, true);<br />canvas.drawBitmap(scalebmp, x, y, null);<br />}<br />}<br />mCloseIcon = new FastBitmapDrawable(folderclose); //將bitmap轉換為Drawable<br />setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);<br />canvas = new Canvas(folderopen);<br />canvas.drawBitmap(folderclose, 0, 0, null);<br />canvas.drawBitmap(openbmp, 0, 0, null);<br />mOpenIcon = new FastBitmapDrawable(folderopen); //繪製open圖片<br />}<br />// add by hmg25 for FolderIcon }<br />public boolean acceptDrop(DragSource source, int x, int y, int xOffset,<br />int yOffset, DragView dragView, Object dragInfo) {<br />final ItemInfo item = (ItemInfo) dragInfo;<br />final int itemType = item.itemType;<br />return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT)<br />&& item.container != mInfo.id;<br />}<br />public Rect estimateDropLocation(DragSource source, int x, int y,<br />int xOffset, int yOffset, DragView dragView, Object dragInfo,<br />Rect recycle) {<br />return null;<br />}<br />public void onDrop(DragSource source, int x, int y, int xOffset,<br />int yOffset, DragView dragView, Object dragInfo) {<br />ShortcutInfo item;<br />if (dragInfo instanceof ApplicationInfo) {<br />// Came from all apps -- make a copy<br />item = ((ApplicationInfo) dragInfo).makeShortcut();<br />} else {<br />item = (ShortcutInfo) dragInfo;<br />}<br />mInfo.add(item);<br />LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0,<br />0);<br />updateFolderIcon(); //拖拽放入時更新<br />}<br />public void onDragEnter(DragSource source, int x, int y, int xOffset,<br />int yOffset, DragView dragView, Object dragInfo) {<br />setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);<br />}<br />public void onDragOver(DragSource source, int x, int y, int xOffset,<br />int yOffset, DragView dragView, Object dragInfo) {<br />}<br />public void onDragExit(DragSource source, int x, int y, int xOffset,<br />int yOffset, DragView dragView, Object dragInfo) {<br />setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);<br />}<br />}<br /> 

 

將檔案拖拽進入檔案夾時響應FolderIcon中的onDrop,所以添加updateFolderIcon();

以上代碼可以實現將表徵圖拖拽進檔案夾時即時更新縮圖顯示,還沒有對拖拽出檔案夾時更新顯示,所以還需要修改其他地方。跟蹤代碼可以看出拖拽離開檔案夾時響應UserFolder中方法onDropCompleted,需要修改UserFolder.java:

public void onDropCompleted(View target, boolean success) {<br /> if (success) {<br /> ShortcutsAdapter adapter = (ShortcutsAdapter)mContent.getAdapter();<br /> adapter.remove(mDragItem);<br /> ((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 拖拽離開時更新<br /> }<br /> }<br />public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,<br /> DragView dragView, Object dragInfo) {<br /> ShortcutInfo item;<br /> if (dragInfo instanceof ApplicationInfo) {<br /> // Came from all apps -- make a copy<br /> item = ((ApplicationInfo)dragInfo).makeShortcut();<br /> } else {<br /> item = (ShortcutInfo)dragInfo;<br /> }<br /> ((ShortcutsAdapter)mContent.getAdapter()).add(item);<br /> LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0);<br /> ((UserFolderInfo)mInfo).mFolderIcon.updateFolderIcon(); //add by hmg25 將檔案直接拖拽到開啟的檔案夾更新<br />}<br /> 

 

從以上代碼可以看出為了傳遞FolderIcon對象,所以我們還需要為UserFolderInfo添加一個mFolderIcon成員,修改UserFolderInfo.java:

 protected FolderIcon mFolderIcon = null; //add by hmg25 for Folder</p><p> //add by hmg25 for Folder {<br /> void setFolderIcon(FolderIcon icon)<br /> {<br /> mFolderIcon=icon;<br /> }<br /> //add by hmg25 for Folder }<br />  

 

以上代碼是在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;     //外邊距

的值。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.