咖啡伴侶

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

          Android 漸變 -- Shader

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

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

            切入正題:Shader有幾個(gè)直接子類:

            BitmapShader    : 圖像渲染

            LinearGradient  : 線性漸變

            RadialGradient  : 環(huán)形漸變

            SweepGradient   : 掃描漸變---圍繞一個(gè)中心點(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.     //聲明一個(gè)圖片渲染  
            22.     BitmapShader bitmapShader = null;  
            23.     //聲明一個(gè)線性漸變  
            24.     LinearGradient linearGradient = null;  
            25.     //聲明一個(gè)環(huán)形漸變  
            26.     RadialGradient radialGradient = null;  
            27.     //聲明一個(gè)掃描漸變  
            28.     //-圍繞一個(gè)中心點(diǎn)掃描漸變就像電影里那種雷達(dá)掃描  
            29.     SweepGradient sweepGradient = null;  
            30.     //聲明一個(gè)組合渲染  
            31.     ComposeShader composeShader = null;  
            32.     //定義畫筆  
            33.     Paint paint = null;  
            34.     //利用這個(gè)類也可以實(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.         //將圖片的長(zhǎng)和高的值賦給變量  
            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對(duì)象  
            101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
            102.         //設(shè)置顯示的圖片  
            103.         shapeDrawable.getPaint().setShader(bitmapShader);  
            104.         //設(shè)置顯示的長(zhǎng)和高  
            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é):

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

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

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

            最后繪制的時(shí)候用此畫筆即可。

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


          主站蜘蛛池模板: 兴义市| 四子王旗| 边坝县| 建湖县| 邯郸县| 开封市| 富民县| 泾阳县| 惠水县| 大关县| 徐水县| 双江| 修文县| 谷城县| 裕民县| 日喀则市| 深圳市| 茌平县| 和林格尔县| 寻乌县| 盐津县| 霍林郭勒市| 长武县| 根河市| 德格县| 广灵县| 监利县| 景东| 永城市| 芦山县| 平罗县| 尚志市| 监利县| 营山县| 大新县| 英吉沙县| 定南县| 尚志市| 平利县| 合山市| 沭阳县|