Android ICON生成及优化(2)

int icon_arr[] = new int[icon_width*icon_height];
        icon.getPixels(icon_arr, 0, icon_width, 0, 0, icon_width, icon_height);
       
        int back_startx = 0, back_starty = 0, back_endx = 0, back_endy = 0;
        /*在图标比背板小的情况下,图标在背板中心位置,相对于背板的位置*/
        int icon_startx,icon_starty,icon_endx,icon_endy;
        int icon_offset = 0;
        if(icon_width < back_width){
            /*图标比较小哈,将其居中显示裁剪*/
            Log.e("pluszhang","get icon smaller");
            back_startx = EDGE_WIDTH;
            back_endx = back_width-EDGE_WIDTH-1;
            back_starty = EDGE_WIDTH;
            back_endy = back_height-EDGE_WIDTH-1;
            icon_offset = back_width-icon_width > EDGE_WIDTH*2?0:EDGE_WIDTH-(back_width-icon_width)/2;
        }
        else if(icon_width == back_width){
            /*直接裁剪即可*/
            back_startx = EDGE_WIDTH;
            back_endx = back_width-EDGE_WIDTH-1;
            back_starty = EDGE_WIDTH;
            back_endy = back_height-EDGE_WIDTH-1;
           
        }

for(int i=0; i<icon_height;i++){
            for(int j=0; j<icon_width;j++){
                if(i<back_starty||i>back_endy||j<back_startx||j>back_endx){
                    icon_arr[i*icon_width+j] = 0;
                }
                else{
                    if((alpha_arr[(i-EDGE_WIDTH)*back_width+j] >> 24 &0xff) < ALPHA_BLUR ||
                            (alpha_arr[(i+EDGE_WIDTH)*back_width+j]  >> 24&0xff)< ALPHA_BLUR ||
                            (alpha_arr[(j-EDGE_WIDTH)+i*back_width]  >> 24&0xff)< ALPHA_BLUR ||
                            (alpha_arr[(j+EDGE_WIDTH)+i*back_width]  >> 24&0xff)< ALPHA_BLUR){
                        icon_arr[i*icon_width+j] = 0;
                    }
                }
            }
        }
        mGarbage.setBackgroundDrawable(backgroundDrawable); 
        mGarbage.setImageBitmap(Bitmap.createBitmap(icon_arr, icon_width, icon_height, Config.ARGB_8888));
        return mGarbage.getDrawingCache();
    }

以上这段代码是采用切的方法实现对图标处理方法,主要来讲就是首先进行标准化,将ICON与背板处理到相同大小,只缩不放大,防止ICON变形,通过背板的Alpha视图,采样绘制ICON,最终实现对ICON的绘制。通过对上述代码分析,由于对图标采用的是扫描方式进行处理,也就是说80X80的图标,要计算6400次,一个图标还好,要是有2,3百个图标,效率确实有些低。关键是效果不太好,由于该方法采用的是采样的方式,对于背板特别不规则的会导致图标边缘切割有许多毛刺,这个问题是该算法自身的问题,采用切的算法,不会有更好的效果,这是该算法本身决定的,如果要达到最优效果,只有更换算法换一种思路。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/48298aa094fa67f4412d25cca9a66048.html