android 線性梯度

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
            /*在位圖矩陣區域內畫一個相切的圓*/
            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);
        }
    }
}

 

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