<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為聲明的類。

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

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


    主站蜘蛛池模板: 亚洲欧洲日韩国产| 亚洲天堂一区二区| 曰批免费视频播放免费| 女人被男人躁的女爽免费视频| 精品亚洲麻豆1区2区3区| 19禁啪啪无遮挡免费网站| 久久亚洲美女精品国产精品| 91精品视频在线免费观看| 亚洲成人网在线观看| 久久精品a一国产成人免费网站 | 日本一道在线日本一道高清不卡免费| 亚洲1区1区3区4区产品乱码芒果 | 人妻仑刮八A级毛片免费看| 亚洲AⅤ优女AV综合久久久| 一级毛片免费一级直接观看| 久久久久亚洲精品中文字幕| 国产啪精品视频网站免费尤物| 国产亚洲精品a在线观看app| 国产日韩一区二区三免费高清 | 亚洲午夜福利在线视频| 妞干网免费观看视频| 免费国产黄网站在线观看动图| 亚洲一级特黄无码片| 午夜网站在线观看免费完整高清观看 | 亚洲精品女同中文字幕| 亚洲精品无码专区2| 久久精品电影免费动漫| 亚洲欧洲春色校园另类小说| 国产成人在线免费观看| 久久国产精品免费一区| 亚洲精品日韩专区silk| 成人黄动漫画免费网站视频| 一级毛片免费不卡直观看| 亚洲美女在线观看播放| 在线观看免费亚洲| 成人性做爰aaa片免费看| 亚洲第一区二区快射影院| 亚洲国产天堂久久久久久| 91精品啪在线观看国产线免费| 亚洲av永久中文无码精品综合| 亚洲国产精品无码一线岛国|