Android学习之Shader渲染

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(00, bitPicWidth, bitPicHeight);  
  106.         //绘制图像  
  107.         shapeDrawable.draw(canvas);  
  108.         //~~~LinearGradient~~~  
  109.         //设置画笔的渲染类型  
  110.         paint.setShader(linearGradient);  
  111.         canvas.drawRect(0, bitPicHeight, 320150, paint);  
  112.         //~~~RadialGradient~~~  
  113.         paint.setShader(radialGradient);  
  114.         canvas.drawCircle(16024066, paint);  
  115.         //~~~SweepGradient  
  116.         paint.setShader(sweepGradient);  
  117.         canvas.drawCircle(10035066, paint);  
  118.         //~~~ComposeShader~~~  
  119.         paint.setShader(composeShader);  
  120.         canvas.drawRect(bitPicWidth, 320320480, paint);  
  121.         surfaceHolder.unlockCanvasAndPost(canvas);  
  122.     }  
  123. }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值