graphic 透明度的bitmap

private static class SampleView extends View {
        private Bitmap mBitmap;
        private Bitmap mBitmap2;
        private Bitmap mBitmap3;
        private Shader mShader;
      
        private static void drawIntoBitmap(Bitmap bm) {
            float x = bm.getWidth();
            float y = bm.getHeight();
            Canvas c = new Canvas(bm);
            Paint p = new Paint();
            /* Paint類的一個邊緣光滑的方法,true表示邊緣光滑*/
            p.setAntiAlias(true);
           
            p.setAlpha(0x80);/設置顏色透明度爲十六進制80(半透明),0x00全透明,0xFF不透明
            /*在位圖矩陣區域內畫一個相切的圓*/
            c.drawCircle(x/2, y/2, x/2, p);
            p.setAlpha(0x30);
       /*用指定的PorterDuff模型創建xformode,PorterDuff.Mode.SRC
             * 表示下面要繪製的文本應在上面繪製的圓的上層
             */
     p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
            p.setTextSize(60);
            /*Paint.Align 是文本對齊方式的一個枚舉類
             * CENTER表示文本居中
             * LEFT 表示做對齊
             * RIGHT 表示右對齊
             */
            p.setTextAlign(Paint.Align.CENTER);
      /*FontMetrics是字體度量的類描述了給定文本大小的各種各樣的字體度量。
             * ascent 表示到基準線之上的距離
             * bottom 表示到基準線之下的最大距離,它是最低的字體類型
             * descent 表示到基準線之下的距離
             * leading 空格字符到基準線的距離,爲0
             * */
            Paint.FontMetrics fm = p.getFontMetrics();
            c.drawText("Alpha", x/2, (y-fm.ascent)/2, p);
        }
      
        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            /*取得資源文件的輸入流*/
            InputStream is = context.getResources()
          .openRawResource(R.drawable.app_sample_code);
            /*BitmapFactory 是位圖的一個工廠類
             * 從各種各樣的位圖對象中創建位圖對象,包括文件,流,字節數組。
             * */
            mBitmap = BitmapFactory.decodeStream(is);
            /*extractAlpha()位圖的這個方法是通過提取
             * 了原始位圖的透明通道值重建新的位圖*/
            mBitmap2 = mBitmap.extractAlpha();
            /*通過位圖的寬度和高度已經位圖的顏色配置來創建位圖
             * Bitmap.Config是內部枚舉類表示位圖的顏色配置
             * 它的顏色配置有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565
             * */
mBitmap3 = Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8);
            drawIntoBitmap(mBitmap3);
  /*LinearGradient類是Shader的一個子類,它實現的是一個線性梯度變化的一個
   * 着色器,(0,0)到(100,70)的直線式顏色梯度變化線
   * 這個梯度變化是在紅綠藍之間均勻變化的
   * Shader.TileMode是超出梯度線的顏色變化模式
*CLAMP 固定shader繪畫時顏色超過原始邊界(梯度線)的部分顏色用邊界顏色繪製。
   *REPEAT 在水平和垂直方向重複使用着色器的色相,但邊界分明
   *MIRROR 在水平和垂直方向重複使用着色器的色相,交換的映像色相使得鄰
   *近的色相總是一致;顏色關於梯度線鏡像
   * */
mShader = new LinearGradient(0, 0, 100, 70,
new int[] {Color.RED, Color.GREEN, Color.BLUE },
                null, Shader.TileMode.MIRROR);
  }
      
        @Override protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            Paint p = new Paint();
            float y = 10;
            /*設置畫筆顏色爲紅色*/
            p.setColor(Color.RED);
        /*調用畫布的drawBitmap方法在指定的位置用指定的畫筆畫指定的位圖*/
            canvas.drawBitmap(mBitmap, 10, y, p);
            /*設置下一個位圖繪製的y座標值*/
            y += mBitmap.getHeight() + 10;
            canvas.drawBitmap(mBitmap2, 10, y, p);
            y += mBitmap2.getHeight() + 10;
            /*設置畫筆的着色器*/
            p.setShader(mShader);
            canvas.drawBitmap(mBitmap3, 10, y, p);
            /*這個類主要裝載了繪製直線曲線等的幾何路徑。*/
            Path path = new Path();
            /*畫上面的梯度變化線*/
            path.moveTo(0, 0);
            path.lineTo(100,70);
            p.setColor(Color.RED);
            /*Paint.Style畫刷的樣式枚舉類
             * STROKE 只繪製筆畫形狀
             * Fill 填充
             * FILL_AND_STROKE 既畫筆畫又填充
             * */
            p.setStyle(Paint.Style.STROKE);
            /*用指定的路徑和指定的畫刷畫要求的路徑*/
            canvas.drawPath(path, p);
        }
    }
}





1. Bitmap.extractAlpha()
位圖的這個方法是通過提取 了原始位圖的透明通道值重建新的位圖

2.Bitmap.Config是內部枚舉類表示位圖的顏色配置, 有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565

3.LinearGradient類是Shader的一個子類,它實現的是一個線性梯度變化的一個着色器,

4.Shader.TileMode是超出梯度線的顏色變化模式
CLAMP--- 固定shader繪畫時顏色超過原始邊界(梯度線)的部分顏色用邊界顏色繪製。REPEAT---在水平和垂直方向重複使用着色器的色相,但邊界分明
MIRROR -----在水平和垂直方向重複使用着色器的色相,交換的映像色相使得鄰近的色相總是一致;顏色關於梯度線鏡像

5.canvas.drawBitmap()

6.Paint.Style畫刷的樣式枚舉類
STROKE--- 只繪製筆畫形狀
Fill ---填充
FILL_AND_STROKE---既畫筆畫又填充

7. p.setXfermode(new PorterDuffXfermode(Mode.SRC));
用指定的PorterDuff模型創建xformode,PorterDuff.Mode.SRC表示下面要繪製的文本應在上面繪製的圓的上層

8.Paint.Align 是文本對齊方式的一個枚舉類
CENTER---表示文本居中
LEFT ---表示做對齊
RIGHT ---表示右對齊

9.Paint.FontMetrics fm = p.getFontMetrics();

FontMetrics是字體度量的類描述了給定文本大小的各種各樣的字體度量。
ascent--- 表示到基準線之上的距離
bottom--表示到基準線之下的最大距離,它是最低的字體類型
descent ---表示到基準線之下的距離
leading--- 空格字符到基準線的距離,爲0

10.p.setAntiAlias(true);
在繪製一個新的Paint對象時,可以通過傳遞給它一些標記來影響它被渲染的方式。ANTI_ALIAS_FLAG是其中一種很有趣的標記,它可以保證在繪製斜線的時候使用抗鋸齒效果來平滑該斜線的外觀。

在繪製文本的時候,抗鋸齒效果尤爲重要,因爲經過抗鋸齒效果處理之後的文本非常容易閱讀。要創建更加平滑的文本效果,可以應用SUBPIXEL_TEXT_FLAG,它將會應用子像素抗鋸齒效果。也可以手工地使用setSubpixelText和setAntiAlias方法來設置這些標記

[color=red][/color]

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