綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[資料] Android Shader類渲染圖像示例

[複製連結] 查看: 1291|回覆: 0|好評: 0
跳轉到指定樓層
樓主
暗桌之光 | 收聽TA | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
發表於 2011-6-12 13:55

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
Android中提供了Shader類專門用來渲染圖像以及一些幾何圖形,Shader下面包括幾個直接子類,分別是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用來渲染圖像,LinearGradient 用來進行梯度渲染,RadialGradient 用來進行環形渲染,SweepGradient 用來進行梯度渲染,ComposeShader則是一個 混合渲染,可以和其它幾個子類組合起來使用。
    Shader類的使用,都需要先構建Shader對象,然後通過Paint的setShader方法設置渲染對象,然後設置渲染對象,然後再繪製時使用這 個Paint對像即可。當然,用不同的渲染時需要構建不同的對象。  下面是一個簡單的示例,其實用起來比較簡單了 只是方法參數比較多。但是還比較容易理解。大家可以去翻翻API 這裡就不深入討論了,以後用到再說吧。
  1. package com.yarin.android.Examples_05_11;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.KeyEvent;  
  6.   
  7. public class Activity01 extends Activity {  
  8.     private GameView mGameView = null;  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.   
  14.         mGameView = new GameView(this);  
  15.   
  16.         setContentView(mGameView);  
  17.     }  
  18.   
  19.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  20.         super.onKeyUp(keyCode, event);  
  21.         return true;  
  22.     }  
  23.   
  24.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  25.         if (mGameView == null) {  
  26.             return false;  
  27.         }  
  28.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  29.             this.finish();  
  30.             return true;  
  31.         }  
  32.         return mGameView.onKeyDown(keyCode, event);  
  33.     }  
  34. }  
  35. GameView

  36. package com.yarin.android.Examples_05_11;  
  37.   
  38. import android.content.Context;  
  39. import android.graphics.Bitmap;  
  40. import android.graphics.BitmapShader;  
  41. import android.graphics.Canvas;  
  42. import android.graphics.Color;  
  43. import android.graphics.ComposeShader;  
  44. import android.graphics.LinearGradient;  
  45. import android.graphics.Paint;  
  46. import android.graphics.PorterDuff;  
  47. import android.graphics.RadialGradient;  
  48. import android.graphics.Shader;  
  49. import android.graphics.SweepGradient;  
  50. import android.graphics.drawable.BitmapDrawable;  
  51. import android.graphics.drawable.ShapeDrawable;  
  52. import android.graphics.drawable.shapes.OvalShape;  
  53. import android.view.KeyEvent;  
  54. import android.view.MotionEvent;  
  55. import android.view.View;  
  56.   
  57. public class GameView extends View implements Runnable  
  58. {  
  59.     /* 聲明Bitmap對像 */  
  60.     Bitmap  mBitQQ  = null;  
  61.     int     BitQQwidth  = 0;  
  62.     int     BitQQheight = 0;  
  63.       
  64.     Paint   mPaint = null;  
  65.            
  66.     /* Bitmap渲染 */  
  67.     Shader mBitmapShader = null;  
  68.       
  69.     /* 線性漸變渲染 */  
  70.     Shader mLinearGradient = null;  
  71.       
  72.     /* 混合渲染 */  
  73.     Shader mComposeShader = null;  
  74.          
  75.     /* 喚醒漸變渲染 */  
  76.     Shader mRadialGradient = null;  
  77.       
  78.     /* 梯度渲染 */  
  79.     Shader mSweepGradient = null;  
  80.         
  81.       
  82.     ShapeDrawable mShapeDrawableQQ = null;  
  83.         
  84.     public GameView(Context context)  
  85.     {  
  86.         super(context);  
  87.          
  88.         /* 裝載資源 */  
  89.         mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();  
  90.   
  91.         /* 得到圖片的寬度和高度 */  
  92.         BitQQwidth = mBitQQ.getWidth();  
  93.         BitQQheight = mBitQQ.getHeight();  
  94.          
  95.         /* 創建BitmapShader對像 */  
  96.         mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);  
  97.          
  98.         /* 創建LinearGradient並設置漸變的顏色數組 說明一下這幾天參數  
  99.          * 第一個 起始的x坐標
  100.          * 第二個 起始的y坐標
  101.                  * 第三個 結束的x坐標
  102.                  * 第四個 結束的y坐標
  103.          * 第五個 顏色數組
  104.          * 第六個 這個也是一個數組用來指定顏色數組的相對位置 如果為null 就沿坡度線均勻分佈
  105.          * 第七個 渲染模式
  106.          * */  
  107.         mLinearGradient = new LinearGradient(0,0,100,100,  
  108.                                              new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},  
  109.                                              null,Shader.TileMode.REPEAT);  
  110.         /* 這裡理解為混合渲染*/  
  111.         mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);  
  112.                  
  113.         /* 構建RadialGradient對象,設置半徑的屬性 */  
  114.         //這裡使用了BitmapShader和LinearGradient進行混合  
  115.         //當然也可以使用其他的組合  
  116.         //混合渲染的模式很多,可以根據自己需要來選擇  
  117.         mRadialGradient = new RadialGradient(50,200,50,  
  118.                                              new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},  
  119.                                              null,Shader.TileMode.REPEAT);  
  120.         /* 構建SweepGradient對像 */  
  121.         mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);  
  122.   
  123.         mPaint = new Paint();  
  124.          
  125.         /* 開啟線程 */  
  126.         new Thread(this).start();  
  127.     }  
  128.       
  129.     public void onDraw(Canvas canvas)  
  130.     {  
  131.         super.onDraw(canvas);  
  132.          
  133.         //將圖片裁剪為橢圓形  
  134.         /* 構建ShapeDrawable對象並定義形狀為橢圓 */  
  135.         mShapeDrawableQQ = new ShapeDrawable(new OvalShape());  
  136.   
  137.         /* 設置要繪製的橢圓形的東西為ShapeDrawable圖片 */  
  138.         mShapeDrawableQQ.getPaint().setShader(mBitmapShader);  
  139.          
  140.         /* 設置顯示區域 */  
  141.         mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);  
  142.          
  143.         /* 繪製ShapeDrawableQQ */  
  144.         mShapeDrawableQQ.draw(canvas);        
  145.          
  146.         //繪製漸變的矩形  
  147.         mPaint.setShader(mLinearGradient);  
  148.         canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);  
  149.               
  150.         //顯示混合渲染效果  
  151.         mPaint.setShader(mComposeShader);  
  152.         canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);  
  153.          
  154.         //繪製環形漸變  
  155.         mPaint.setShader(mRadialGradient);  
  156.         canvas.drawCircle(50, 200, 50, mPaint);  
  157.          
  158.         //繪製梯度漸變  
  159.         mPaint.setShader(mSweepGradient);  
  160.         canvas.drawRect(150, 160, 300, 300, mPaint);  
  161.          
  162.     }  
  163.       
  164.     // 觸筆事件  
  165.     public boolean onTouchEvent(MotionEvent event)  
  166.     {  
  167.         return true;  
  168.     }  
  169.   
  170.   
  171.     // 按鍵按下事件  
  172.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  173.     {  
  174.         return true;  
  175.     }  
  176.   
  177.   
  178.     // 按鍵彈起事件  
  179.     public boolean onKeyUp(int keyCode, KeyEvent event)  
  180.     {  
  181.         return false;  
  182.     }  
  183.   
  184.   
  185.     public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)  
  186.     {  
  187.         return true;  
  188.     }  
  189.       
  190.       
  191.     /**
  192.      * 線程處理
  193.      */  
  194.     public void run()  
  195.     {  
  196.         while (!Thread.currentThread().isInterrupted())  
  197.         {  
  198.             try  
  199.             {  
  200.                 Thread.sleep(100);  
  201.             }  
  202.             catch (InterruptedException e)  
  203.             {  
  204.                 Thread.currentThread().interrupt();  
  205.             }  
  206.             //使用postInvalidate可以直接在線程中更新界面  
  207.             postInvalidate();  
  208.         }  
  209.     }  
  210. }
複製代碼
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 1碎鑽 +5 收起 理由
y776 + 5

查看全部評分

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則