天天看點

android 桌面檔案平夾

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

    android原生自帶的桌面檔案夾樣式及其簡單,沒有iphone那種可以顯示檔案夾内檔案圖示縮略圖的功能,今天我們來簡單的實作一個。

效果如下:

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

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);  

    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,  

        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,  

        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,  

        setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);  

    public void onDragOver(DragSource source, int x, int y, int xOffset,  

    public void onDragExit(DragSource source, int x, int y, int xOffset,  

}  

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

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

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:

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

的值。

繼續閱讀