ApiDemo學習之CreateBitmap以及 Paint類介紹

 
private static final int WIDTH = 50;
    private static final int HEIGHT = 50;
    private static final int STRIDE = 64;   // must be >= WIDTH
    
    /**
     * 創建顏色數組,ARGB8888,每一個顏色值都介於(0,255)之間
     * @return
     */
    private static int[] createColors() {
        int[] colors = new int[STRIDE * HEIGHT];
        for (int y = 0; y < HEIGHT; y++) {
            for (int x = 0; x < WIDTH; x++) {
                int r = x * 255 / (WIDTH - 1);
                int g = y * 255 / (HEIGHT - 1);
                int b = 255 - Math.min(r, g);
                int a = Math.max(r, g);
                colors[y * STRIDE + x] = (a << 24) | (r << 16) | (g << 8) | b;
            }
        }
        return colors;
    }
        
    private static class SampleView extends View {
        private Bitmap[] mBitmaps;
        private Bitmap[] mJPEG;
        private Bitmap[] mPNG;
        private int[]    mColors;
        private Paint    mPaint;
        
        /**
         * 將bitmap轉話爲PNG,或者JPG格式
         * @param src 原始bitmap
         * @param format bitmap的壓縮格式
         * @param quality 質量介於(0,100之間),png的時候,基本不考慮這個值,爲0
         * @return
         */
        private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
                                    int quality) {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            src.compress(format, quality, os);            

            byte[] array = os.toByteArray();//將bitmap轉化爲2進制流數組
            return BitmapFactory.decodeByteArray(array, 0, array.length);
        }

        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            
            mColors = createColors();
            int[] colors = mColors;

            mBitmaps = new Bitmap[6];
            // these three are initialized with colors[]
            mBitmaps[0] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
                                              Bitmap.Config.ARGB_8888);
            mBitmaps[1] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
                                              Bitmap.Config.RGB_565);
            mBitmaps[2] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
                                              Bitmap.Config.ARGB_4444);
            
            // these three will have their colors set later
            mBitmaps[3] = Bitmap.createBitmap(WIDTH, HEIGHT,
                                              Bitmap.Config.ARGB_8888);
            mBitmaps[4] = Bitmap.createBitmap(WIDTH, HEIGHT,
                                              Bitmap.Config.RGB_565);
            mBitmaps[5] = Bitmap.createBitmap(WIDTH, HEIGHT,
                                              Bitmap.Config.ARGB_4444);
            
            for (int i = 3; i <= 5; i++) {
                mBitmaps[i].setPixels(colors, 0, STRIDE, 0, 0, WIDTH, HEIGHT);
            }
            
            mPaint = new Paint();
            //設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,
            //圖像更加清晰  
            mPaint.setDither(true);  

            // now encode/decode using JPEG and PNG
            mJPEG = new Bitmap[mBitmaps.length];
            mPNG = new Bitmap[mBitmaps.length];
            for (int i = 0; i < mBitmaps.length; i++) {
                mJPEG[i] = codec(mBitmaps[i], Bitmap.CompressFormat.JPEG, 80);
                mPNG[i] = codec(mBitmaps[i], Bitmap.CompressFormat.PNG, 0);
            }
        }
        
        @Override protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);//繪製白色背景

            for (int i = 0; i < mBitmaps.length; i++) {
                canvas.drawBitmap(mBitmaps[i], 0, 0, null);
                canvas.drawBitmap(mJPEG[i], 80, 0, null);
                canvas.drawBitmap(mPNG[i], 160, 0, null);
                canvas.translate(0, mBitmaps[i].getHeight());//移動原點座標
            }
            
            // draw the color array directly, w/o craeting a bitmap object
            canvas.drawBitmap(mColors, 0, STRIDE, 0, 0, WIDTH, HEIGHT,
                              true, null);
            canvas.translate(0, HEIGHT);
            canvas.drawBitmap(mColors, 0, STRIDE, 0, 0, WIDTH, HEIGHT,
                              false, mPaint);
        }
    }

/**  

         *   

     * Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色,  

     * 樣式等繪製信息,指定了如何繪製文本和圖形,畫筆對象有很多設置方法,  

     * 大體上可以分爲兩類,一類與圖形繪製相關,一類與文本繪製相關。         

     *   

     * 1.圖形繪製  

     * setARGB(int a,int r,int g,int b);  

     * 設置繪製的顏色,a代表透明度,r,g,b代表顏色值。  

     *   

     * setAlpha(int a);  

     * 設置繪製圖形的透明度。  

     *   

     * setColor(int color);  

     * 設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。  

     *   

    * setAntiAlias(boolean aa);  

     * 設置是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。  

     *   

     * setDither(boolean dither);  

     * 設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰  

     *   

     * setFilterBitmap(boolean filter);  

     * 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示  

     * 速度,本設置項依賴於dither和xfermode的設置  

     *   

     * setMaskFilter(MaskFilter maskfilter);  

     * 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等       *   

     * setColorFilter(ColorFilter colorfilter);  

     * 設置顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果  

     *   

     * setPathEffect(PathEffect effect);  

     * 設置繪製路徑的效果,如點畫線等  

     *   

     * setShader(Shader shader);  

     * 設置圖像效果,使用Shader可以繪製出各種漸變效果  

     *  

     * setShadowLayer(float radius ,float dx,float dy,int color);  

     * 在圖形下面設置陰影層,產生陰影效果,radius爲陰影的角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色  

     *   

     * setStyle(Paint.Style style);  

     * 設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE  

     *   

     * setStrokeCap(Paint.Cap cap);  

     * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式  

     * Cap.ROUND,或方形樣式Cap.SQUARE  

     *   

     * setSrokeJoin(Paint.Join join);  

     * 設置繪製時各圖形的結合方式,如平滑效果等  

     *   

     * setStrokeWidth(float width);  

     * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度  

     *   

     * setXfermode(Xfermode xfermode);  

     * 設置圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果  

     *   

     * 2.文本繪製  

     * setFakeBoldText(boolean fakeBoldText);  

     * 模擬實現粗體文字,設置在小字體上效果會非常差  

     *   

     * setSubpixelText(boolean subpixelText);  

     * 設置該項爲true,將有助於文本在LCD屏幕上的顯示效果  

     *   

     * setTextAlign(Paint.Align align);  

     * 設置繪製文字的對齊方向  

     *   

   * setTextScaleX(float scaleX);  

    * 設置繪製文字x軸的縮放比例,可以實現文字的拉伸的效果  

     *   

     * setTextSize(float textSize);  

     * 設置繪製文字的字號大小  

     *   

     * setTextSkewX(float skewX);  

     * 設置斜體文字,skewX爲傾斜弧度  

     *   

     * setTypeface(Typeface typeface);  

     * 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等  

     *   

     * setUnderlineText(boolean underlineText);  

     * 設置帶有下劃線的文字效果  

     *   

     * setStrikeThruText(boolean strikeThruText);  

     * 設置帶有刪除線的效果  

     *   

     */ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章