android Shader 渲染

引用:http://www.apkbus.com/forum.php?mod=viewthread&tid=1727

 Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用。 
    Shader类的使用,都需要先构建Shader对象,然后通过Paint的setShader方法设置渲染对象,然后设置渲染对象,然后再绘制时使用这个Paint对象即可。当然,用不同的渲染时需要构建不同的对象。  下面是一个简单的示例,其实用起来比较简单了 只是方法参数比较多。但是还比较容易理解。大家可以去翻翻API 这里就不深入讨论了,以后用到再说吧。 

<ignore_js_op>1.jpg 

Activity01 
Java代码

  1. package com.yarin.android.Examples_05_11;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.KeyEvent;
  5. public class Activity01 extends Activity {
  6.         private GameView mGameView = null;
  7.         @Override
  8.         public void onCreate(Bundle savedInstanceState) {
  9.                 super.onCreate(savedInstanceState);
  10.                 mGameView = new GameView(this);
  11.                 setContentView(mGameView);
  12.         }
  13.         public boolean onKeyUp(int keyCode, KeyEvent event) {
  14.                 super.onKeyUp(keyCode, event);
  15.                 return true;
  16.         }
  17.         public boolean onKeyDown(int keyCode, KeyEvent event) {
  18.                 if (mGameView == null) {
  19.                         return false;
  20.                 }
  21.                 if (keyCode == KeyEvent.KEYCODE_BACK) {
  22.                         this.finish();
  23.                         return true;
  24.                 }
  25.                 return mGameView.onKeyDown(keyCode, event);
  26.         }
  27. }
复制代码


GameView 
Java代码

  1. package com.yarin.android.Examples_05_11;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapShader;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.ComposeShader;
  8. import android.graphics.LinearGradient;
  9. import android.graphics.Paint;
  10. import android.graphics.PorterDuff;
  11. import android.graphics.RadialGradient;
  12. import android.graphics.Shader;
  13. import android.graphics.SweepGradient;
  14. import android.graphics.drawable.BitmapDrawable;
  15. import android.graphics.drawable.ShapeDrawable;
  16. import android.graphics.drawable.shapes.OvalShape;
  17. import android.view.KeyEvent;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. public class GameView extends View implements Runnable
  21. {
  22.         /* 声明Bitmap对象 */
  23.         Bitmap        mBitQQ        = null;
  24.         int                BitQQwidth        = 0;
  25.         int                BitQQheight        = 0;
  26.         
  27.         Paint   mPaint = null;
  28.              
  29.         /* Bitmap渲染 */
  30.         Shader mBitmapShader = null;
  31.         
  32.         /* 线性渐变渲染 */
  33.         Shader mLinearGradient = null;
  34.         
  35.         /* 混合渲染 */
  36.         Shader mComposeShader = null;
  37.            
  38.         /* 唤醒渐变渲染 */
  39.         Shader mRadialGradient = null;
  40.         
  41.         /* 梯度渲染 */
  42.         Shader mSweepGradient = null;
  43.           
  44.         
  45.         ShapeDrawable mShapeDrawableQQ = null;
  46.           
  47.         public GameView(Context context)
  48.         {
  49.                 super(context);
  50.                 
  51.                 /* 装载资源 */
  52.                 mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();
  53.                 /* 得到图片的宽度和高度 */
  54.                 BitQQwidth = mBitQQ.getWidth();
  55.                 BitQQheight = mBitQQ.getHeight();
  56.                 
  57.                 /* 创建BitmapShader对象 */
  58.                 mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
  59.                 
  60.                 /* 创建LinearGradient并设置渐变的颜色数组 说明一下这几天参数 
  61.                  * 第一个 起始的x坐标
  62.                  * 第二个 起始的y坐标
  63.                  * 第三个 结束的x坐标
  64.                  * 第四个 结束的y坐标
  65.                  * 第五个 颜色数组
  66.                  * 第六个 这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布
  67.                  * 第七个 渲染模式
  68.                  * */
  69.                 mLinearGradient = new LinearGradient(0,0,100,100,
  70.                                                                                          new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
  71.                                                                                          null,Shader.TileMode.REPEAT);
  72.                 /* 这里理解为混合渲染*/
  73.                 mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
  74.                        
  75.                 /* 构建RadialGradient对象,设置半径的属性 */
  76.                 //这里使用了BitmapShader和LinearGradient进行混合
  77.                 //当然也可以使用其他的组合
  78.                 //混合渲染的模式很多,可以根据自己需要来选择
  79.                 mRadialGradient = new RadialGradient(50,200,50,
  80.                                                                                          new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},
  81.                                                                                          null,Shader.TileMode.REPEAT);
  82.                 /* 构建SweepGradient对象 */
  83.                 mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
  84.                 mPaint = new Paint();
  85.                 
  86.                 /* 开启线程 */
  87.                 new Thread(this).start();
  88.         }
  89.         
  90.         public void onDraw(Canvas canvas)
  91.         {
  92.                 super.onDraw(canvas);
  93.                 
  94.                 //将图片裁剪为椭圆形
  95.                 /* 构建ShapeDrawable对象并定义形状为椭圆 */
  96.                 mShapeDrawableQQ = new ShapeDrawable(new OvalShape());
  97.                 /* 设置要绘制的椭圆形的东西为ShapeDrawable图片 */
  98.                 mShapeDrawableQQ.getPaint().setShader(mBitmapShader);
  99.                 
  100.                 /* 设置显示区域 */
  101.                 mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);
  102.                 
  103.                 /* 绘制ShapeDrawableQQ */
  104.                 mShapeDrawableQQ.draw(canvas);                 
  105.                 
  106.                 //绘制渐变的矩形
  107.                 mPaint.setShader(mLinearGradient);
  108.                 canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);
  109.                 
  110.                 //显示混合渲染效果
  111.                 mPaint.setShader(mComposeShader);
  112.                 canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);
  113.                 
  114.                 //绘制环形渐变
  115.                 mPaint.setShader(mRadialGradient);
  116.                 canvas.drawCircle(50, 200, 50, mPaint);
  117.                 
  118.                 //绘制梯度渐变
  119.                 mPaint.setShader(mSweepGradient);
  120.                 canvas.drawRect(150, 160, 300, 300, mPaint);
  121.                 
  122.         }
  123.         
  124.         // 触笔事件
  125.         public boolean onTouchEvent(MotionEvent event)
  126.         {
  127.                 return true;
  128.         }
  129.         // 按键按下事件
  130.         public boolean onKeyDown(int keyCode, KeyEvent event)
  131.         {
  132.                 return true;
  133.         }
  134.         // 按键弹起事件
  135.         public boolean onKeyUp(int keyCode, KeyEvent event)
  136.         {
  137.                 return false;
  138.         }
  139.         public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
  140.         {
  141.                 return true;
  142.         }
  143.         
  144.         
  145.         /**
  146.          * 线程处理
  147.          */
  148.         public void run()
  149.         {
  150.                 while (!Thread.currentThread().isInterrupted())
  151.                 {
  152.                         try
  153.                         {
  154.                                 Thread.sleep(100);
  155.                         }
  156.                         catch (InterruptedException e)
  157.                         {
  158.                                 Thread.currentThread().interrupt();
  159.                         }
  160.                         //使用postInvalidate可以直接在线程中更新界面
  161.                         postInvalidate();
  162.                 }
  163.         }
  164. }
复制代码

<ignore_js_op> Examples_05_11.rar (121.93 KB, 下载次数: 49) 

2011-5-5 10:14 上传
点击文件名下载附件 
下载积分: 下载豆 -1
 
posted @ 2012-08-24 23:28  镇水古月  阅读(254)  评论(0编辑  收藏  举报