咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          Android 漸變 -- Shader

          Posted on 2011-07-25 11:41 oathleo 閱讀(1209) 評論(0)  編輯  收藏 所屬分類: Android

            大家好,今天和大家分享的是Android中渲染圖像和圖形的類,這也是我第一次在Linux上寫Android程序,呵呵,感覺還不錯!

            切入正題:Shader有幾個直接子類:

            BitmapShader    : 圖像渲染

            LinearGradient  : 線性漸變

            RadialGradient  : 環(huán)形漸變

            SweepGradient   : 掃描漸變---圍繞一個中心點(diǎn)掃描漸變就像電影里那種雷達(dá)掃描

            ComposeShader   : 組合渲染

            先看效果圖:


            先保存好你要在BitmapShader中顯示的圖片.

             

            看代碼(代碼中帶有注釋):

            我采用的還是SurefaceView框架,

             

            1. package com.ldj.helloshader;  
            2. import android.content.Context;  
            3. import android.graphics.*;  
            4. import android.graphics.Shader.TileMode;  
            5. import android.graphics.drawable.BitmapDrawable;  
            6. import android.graphics.drawable.ShapeDrawable;  
            7. import android.graphics.drawable.shapes.OvalShape;  
            8. import android.view.*;  
            9. public class ShaderView extends SurfaceView implements SurfaceHolder.Callback,Runnable{  
            10.     //聲明漸變的顏色數(shù)組  
            11.     private int[] color =   
            12.         new int[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};  
            13.     private boolean loop = false;  
            14.     private SurfaceHolder surfaceHolder;  
            15.       
            16.     private Bitmap bitPic = null;  
            17.       
            18.     int bitPicWidth = 0;  
            19.     int bitPicHeight = 0;  
            20.       
            21.     //聲明一個圖片渲染  
            22.     BitmapShader bitmapShader = null;  
            23.     //聲明一個線性漸變  
            24.     LinearGradient linearGradient = null;  
            25.     //聲明一個環(huán)形漸變  
            26.     RadialGradient radialGradient = null;  
            27.     //聲明一個掃描漸變  
            28.     //-圍繞一個中心點(diǎn)掃描漸變就像電影里那種雷達(dá)掃描  
            29.     SweepGradient sweepGradient = null;  
            30.     //聲明一個組合渲染  
            31.     ComposeShader composeShader = null;  
            32.     //定義畫筆  
            33.     Paint paint = null;  
            34.     //利用這個類也可以實(shí)現(xiàn)繪制圖像的功能  
            35.     ShapeDrawable shapeDrawable = null;  
            36.       
            37.     public ShaderView(Context context) {  
            38.         super(context);  
            39.         surfaceHolder = this.getHolder();  
            40.         //增加回調(diào)  
            41.         surfaceHolder.addCallback(this);  
            42.         loop = true;  
            43.         paint = new Paint();  
            44.         //獲取圖像資源  
            45.         bitPic =   
            46.             ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))  
            47.             .getBitmap();  
            48.         //將圖片的長和高的值賦給變量  
            49.         bitPicWidth = bitPic.getWidth();  
            50.         bitPicHeight = bitPic.getHeight();  
            51.         /* 
            52.          * ~~~BitmapShader(Bitmap,TileMode,TileMode)~~~ 
            53.          */  
            54.         bitmapShader = new BitmapShader(bitPic, TileMode.REPEAT, TileMode.MIRROR);  
            55.         /* 
            56.          * ~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~ 
            57.          */  
            58.         linearGradient = new LinearGradient(0,0,100,100,color,null,TileMode.REPEAT);  
            59.         /* 
            60.          * ~~~RadialGradient~~~ 
            61.          */  
            62.         radialGradient = new RadialGradient(160,240,66,color,null,TileMode.MIRROR);  
            63.         /* 
            64.          * ~~~SweepGradient~~~ 
            65.          */  
            66.         sweepGradient = new SweepGradient(100,350,color,null);  
            67.         //~~~ComposeShader(shaderA,shaderB,Mode)~~~  
            68.         //組合線性和環(huán)形兩種漸變,當(dāng)然其他的也可以的  
            69.         composeShader   
            70.             = new ComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);  
            71.     }  
            72.     @Override  
            73.     public void run() {  
            74.         while(loop) {  
            75.             draw();  
            76.             try {  
            77.                 Thread.sleep(100);  
            78.             } catch (InterruptedException e) {  
            79.                 e.printStackTrace();  
            80.             }  
            81.         }  
            82.     }  
            83.     @Override  
            84.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
            85.     }  
            86.     @Override  
            87.     public void surfaceCreated(SurfaceHolder arg0) {  
            88.         new Thread(this).start();  
            89.     }  
            90.     @Override  
            91.     public void surfaceDestroyed(SurfaceHolder arg0) {  
            92.         loop = false;  
            93.     }  
            94.       
            95.     private void draw() {  
            96.         Canvas canvas = surfaceHolder.lockCanvas();  
            97.         /* 
            98.          * ~~~BitmapShader 
            99.          */  
            100.         //構(gòu)造形狀為橢圓的shapeDrawable對象  
            101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
            102.         //設(shè)置顯示的圖片  
            103.         shapeDrawable.getPaint().setShader(bitmapShader);  
            104.         //設(shè)置顯示的長和高  
            105.         shapeDrawable.setBounds(0, 0, bitPicWidth, bitPicHeight);  
            106.         //繪制圖像  
            107.         shapeDrawable.draw(canvas);  
            108.         //~~~LinearGradient~~~  
            109.         //設(shè)置畫筆的渲染類型  
            110.         paint.setShader(linearGradient);  
            111.         canvas.drawRect(0, bitPicHeight, 320, 150, paint);  
            112.         //~~~RadialGradient~~~  
            113.         paint.setShader(radialGradient);  
            114.         canvas.drawCircle(160, 240, 66, paint);  
            115.         //~~~SweepGradient  
            116.         paint.setShader(sweepGradient);  
            117.         canvas.drawCircle(100, 350, 66, paint);  
            118.         //~~~ComposeShader~~~  
            119.         paint.setShader(composeShader);  
            120.         canvas.drawRect(bitPicWidth, 320, 320, 480, paint);  
            121.         surfaceHolder.unlockCanvasAndPost(canvas);  
            122.     }  
            123. }  

             

            總結(jié):

            配色弄的不是很好看,大家可別見怪,大體來說渲染圖像或圖形三步:

            首先是聲明渲染或漸變類。

            然后將畫筆setShader為聲明的類。

            最后繪制的時候用此畫筆即可。

            好了,今天到這里了,謝謝大家閱讀。


          主站蜘蛛池模板: 贵港市| 邵阳县| 蒙自县| 将乐县| 通州市| 县级市| 沁源县| 博爱县| 万载县| 土默特右旗| 水富县| 鄱阳县| 怀柔区| 青海省| 郯城县| 叶城县| 泗水县| 铁力市| 镇巴县| 博白县| 陈巴尔虎旗| 民勤县| 阿拉善右旗| 开江县| 新闻| 安福县| 武穴市| 正蓝旗| 姜堰市| 儋州市| 精河县| 长子县| 航空| 大厂| 晋中市| 体育| 武宣县| 庆云县| 通河县| 游戏| 赤壁市|