Android提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。BitmapShader主要用来渲染图像,LinearGradient用来进行线性渲染,RadialGradient用来进行环形渲染,SweepGradient用来进行梯度演染,BitmapShader则是一个棍合渲染,可以和其他几个了类组合起来使用。下面的示例将分别分析它们的使用方法。
如果需要将一张图片裁剪成椭圆或圆形等形状展示给用户,这时需要使用BitmapShader类来裁剪,我们随时可以看到一些渐变的效果,而在 Android中可以用LinearGradient、RadialGradient、SweepGradient很轻松地来完成。首先来看看示例的运行效果,如图5-16所示,每个图形分别使用了不同的渲染。

Shader类的使用,都需要先构建Shader对象,然后通过Paint的setShader方法来设置渲染对象,然后在绘制时使用这个Paint对象即可。当然,用不同的渲染时需要构建不同的对象,具体实现的代码如下:
001 | package com.yarin.android.Examples_05_11; |
003 | import android.content.Context; |
004 | import android.graphics.Bitmap; |
005 | import android.graphics.BitmapShader; |
006 | import android.graphics.Canvas; |
007 | import android.graphics.Color; |
008 | import android.graphics.ComposeShader; |
009 | import android.graphics.LinearGradient; |
010 | import android.graphics.Paint; |
011 | import android.graphics.PorterDuff; |
012 | import android.graphics.RadialGradient; |
013 | import android.graphics.Shader; |
014 | import android.graphics.SweepGradient; |
015 | import android.graphics.drawable.BitmapDrawable; |
016 | import android.graphics.drawable.ShapeDrawable; |
017 | import android.graphics.drawable.shapes.OvalShape; |
018 | import android.view.KeyEvent; |
019 | import android.view.MotionEvent; |
020 | import android.view.View; |
022 | public class GameView extends View implements Runnable |
025 | Bitmap mBitQQ = null ; |
032 | Shader mBitmapShader = null ; |
035 | Shader mLinearGradient = null ; |
038 | Shader mComposeShader = null ; |
041 | Shader mRadialGradient = null ; |
044 | Shader mSweepGradient = null ; |
047 | ShapeDrawable mShapeDrawableQQ = null ; |
049 | public GameView(Context context) |
054 | mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap(); |
057 | BitQQwidth = mBitQQ.getWidth(); |
058 | BitQQheight = mBitQQ.getHeight(); |
060 | /** 创建BitmapShader对象 */ |
061 | mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR); |
063 | /** 创建LinearGradient并设置渐变的颜色数组 */ |
064 | mLinearGradient = new LinearGradient( 0 , 0 , 100 , 100 , |
065 | new int []{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE}, |
066 | null ,Shader.TileMode.REPEAT); |
067 | /** 这里笔者理解为“混合渲染”--大家可以有自己的理解,能明白这个意思就好*/ |
068 | mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN); |
070 | /** 构建RadialGradient对象,设置半径的属性 */ |
074 | mRadialGradient = new RadialGradient( 50 , 200 , 50 , |
075 | new int []{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, |
076 | null ,Shader.TileMode.REPEAT); |
077 | /** 构建SweepGradient对象 */ |
078 | mSweepGradient = new SweepGradient( 30 , 30 , new int []{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null ); |
080 | mPaint = new Paint(); |
083 | new Thread( this ).start(); |
086 | public void onDraw(Canvas canvas) |
088 | super .onDraw(canvas); |
091 | /** 构建ShapeDrawable对象并定义形状为椭圆 */ |
092 | mShapeDrawableQQ = new ShapeDrawable( new OvalShape()); |
094 | /** 设置要绘制的椭圆形的东西为ShapeDrawable图片 */ |
095 | mShapeDrawableQQ.getPaint().setShader(mBitmapShader); |
098 | mShapeDrawableQQ.setBounds( 0 , 0 , BitQQwidth, BitQQheight); |
100 | /** 绘制ShapeDrawableQQ */ |
101 | mShapeDrawableQQ.draw(canvas); |
104 | mPaint.setShader(mLinearGradient); |
105 | canvas.drawRect(BitQQwidth, 0 , 320 , 156 , mPaint); |
108 | mPaint.setShader(mComposeShader); |
109 | canvas.drawRect( 0 , 300 , BitQQwidth, 300 +BitQQheight, mPaint); |
112 | mPaint.setShader(mRadialGradient); |
113 | canvas.drawCircle( 50 , 200 , 50 , mPaint); |
116 | mPaint.setShader(mSweepGradient); |
117 | canvas.drawRect( 150 , 160 , 300 , 300 , mPaint); |
122 | public boolean onTouchEvent(MotionEvent event) |
129 | public boolean onKeyDown( int keyCode, KeyEvent event) |
136 | public boolean onKeyUp( int keyCode, KeyEvent event) |
142 | public boolean onKeyMultiple( int keyCode, int repeatCount, KeyEvent event) |
153 | while (!Thread.currentThread().isInterrupted()) |
159 | catch (InterruptedException e) |
161 | Thread.currentThread().interrupt(); |
至此,Android的Shader用法也介绍完了,谢谢阅读