android shader类简介 渲染图像示例

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



Activity01
Java代码  收藏代码
  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. }  


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


源码附件
   
  • Examples_05_11.rar (121.9 KB)
  • 下载次数: 526
  • 查看图片附件

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 忘记宽带账号密码怎么办 12123被注册过怎么办 w10不能创建账户怎么办 忘记xp登录密码怎么办 华硕密码忘记了怎么办 电脑账户已停用怎么办 鼠标灯亮不动怎么办 电脑用户名被停用怎么办 电脑截图不清晰怎么办 win10电脑磁盘空间不足怎么办 我的用户名忘记怎么办 12306用户名密码忘记怎么办 电脑开机要密码怎么办 三星账户忘记了怎么办 电脑账户忘记了怎么办 电脑启动要密码怎么办 电脑用户密码忘记了怎么办 微信语音听不懂怎么办 法院迟迟不立案怎么办 dns连不上网怎么办 监控显示无硬盘怎么办 电脑获取不到dns怎么办 打游戏cpu过高怎么办 注册了公司没做账怎么办 工行u盾没电了怎么办 属狗和属鸡相害怎么办 被别人说老实怎么办 牛手术后低烧怎么办 按摩把腿按肿了怎么办 吃感冒药特别困怎么办 剖腹产平躺腰疼怎么办 早餐店没生意怎么办 摆小吃摊没生意怎么办 早餐生意不好做怎么办 小吃车不让出摊怎么办 淘宝订单消失了怎么办 工厂搬迁托着不处理怎么办 电磁炉不识别锅怎么办 冰箱电线不够长怎么办 成品衣柜不到顶怎么办 安迪达斯实体店授权书怎么办