咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

Android 渐变 -- Shader

Posted on 2011-07-25 11:41 oathleo 阅读(1197) 评论(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为声明的类。

    最后绘制的时候用此画笔即可。

    好了,今天到这里了,谢谢大家阅读。



只有注册用户登录后才能发表评论。


网站导航: