<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    咖啡伴侶

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

    Android 漸變 -- Shader

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

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

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

      BitmapShader    : 圖像渲染

      LinearGradient  : 線性漸變

      RadialGradient  : 環形漸變

      SweepGradient   : 掃描漸變---圍繞一個中心點掃描漸變就像電影里那種雷達掃描

      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.     //聲明漸變的顏色數組  
      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.     //聲明一個環形漸變  
      26.     RadialGradient radialGradient = null;  
      27.     //聲明一個掃描漸變  
      28.     //-圍繞一個中心點掃描漸變就像電影里那種雷達掃描  
      29.     SweepGradient sweepGradient = null;  
      30.     //聲明一個組合渲染  
      31.     ComposeShader composeShader = null;  
      32.     //定義畫筆  
      33.     Paint paint = null;  
      34.     //利用這個類也可以實現繪制圖像的功能  
      35.     ShapeDrawable shapeDrawable = null;  
      36.       
      37.     public ShaderView(Context context) {  
      38.         super(context);  
      39.         surfaceHolder = this.getHolder();  
      40.         //增加回調  
      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.         //組合線性和環形兩種漸變,當然其他的也可以的  
      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.         //構造形狀為橢圓的shapeDrawable對象  
      101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
      102.         //設置顯示的圖片  
      103.         shapeDrawable.getPaint().setShader(bitmapShader);  
      104.         //設置顯示的長和高  
      105.         shapeDrawable.setBounds(0, 0, bitPicWidth, bitPicHeight);  
      106.         //繪制圖像  
      107.         shapeDrawable.draw(canvas);  
      108.         //~~~LinearGradient~~~  
      109.         //設置畫筆的渲染類型  
      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. }  

       

      總結:

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

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

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

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

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


    主站蜘蛛池模板: MM1313亚洲国产精品| 亚洲最大中文字幕无码网站| 久久www免费人成看国产片| 免费精品国产自产拍观看| 青青青亚洲精品国产| 国产一区二区三区免费看| 免费无遮挡无遮羞在线看| 亚洲免费无码在线| 岛国精品一区免费视频在线观看| 久久精品国产精品亚洲艾草网美妙| 春意影院午夜爽爽爽免费| 国产V亚洲V天堂无码| 久久A级毛片免费观看| 亚洲一级视频在线观看| 手机看黄av免费网址| 亚洲精品伦理熟女国产一区二区| 国产在线a不卡免费视频| 国产免费伦精品一区二区三区| 亚洲精品无码久久久久sm| 天天影院成人免费观看| 亚洲欧美黑人猛交群| 亚洲色偷偷综合亚洲AV伊人| 国产午夜无码精品免费看| 91嫩草亚洲精品| 在线日韩av永久免费观看| 国产vA免费精品高清在线观看 | 午夜亚洲国产成人不卡在线| aa午夜免费剧场| 亚洲精品不卡视频| 午夜高清免费在线观看| 黄 色一级 成 人网站免费| 亚洲福利一区二区精品秒拍| 日韩视频免费一区二区三区| a级毛片免费网站| 91丁香亚洲综合社区| 亚洲午夜福利精品久久| 和日本免费不卡在线v| 成在线人免费无码高潮喷水| 亚洲精品一二三区| 亚洲日韩精品无码专区网址 | 日韩免费高清大片在线|