Paint包含了一个setShader(Shader s)方法,该方法控制"画笔"的渲染效果:Android不仅可以使用颜色来填充图形(包括矩形,椭圆,圆形等各种几何图形),也可以使用Shader对象指定的渲染效果来填充图形.
Shader本身是一个抽象类,它提供了如下实现类:
> BitmapShader: 使用位图平铺的渲染效果.
> LinearGradient: 使用线性渐变来填充图形.
> RadialGradient: 使用圆形渐变来填充图形.
> SweepGradient: 使用角度渐变来填充图形.
> ComposeShader: 使用组合渲染效果来填充图形.
上面的渲染效果,与Flash提供的位图平铺,线性渐变,圆形渐变,角度渐变完全一样.
下面的例子包含了5个按钮,当单击不同按钮时,系统将会设置Paint使用不同的Shader,这样既可看到不同的Shader效果.
1.Activity代码
package com.example.matrixdemo;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposeShader;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.graphics.SweepGradient;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
/***
* Shader实现图形渲染
* @author Administrator
*
*/
public class ShaderActivity extends Activity implements OnClickListener {
/** 声明位图渲染对象 */
private Shader[] shaders = new Shader[5];
/** 声明颜色数组 */
private int[] colors;
/** 自定义组件 */
private MyView myView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shader);
myView = (MyView) findViewById(R.id.my_view);
// 获取bitmap实例
Bitmap bm = BitmapFactory.decodeResource(getResources(),
R.drawable.bg02);
// 设置渐变颜色组,也就是按红,绿,蓝的方式渐变
colors = new int[] { Color.RED, Color.GREEN, Color.BLUE };
// 实例化BitmapShader,x坐标方向重复图形,y坐标方向镜像图形
shaders[0] = new BitmapShader(bm, TileMode.REPEAT, TileMode.MIRROR);
// 实例化LinearGradient
shaders[1] = new LinearGradient(0, 0, 100, 100, colors, null,
TileMode.REPEAT);
// 实例化RadialGradient
shaders[2] = new RadialGradient(100, 100, 80, colors, null,
TileMode.REPEAT);
// 实例化SweepGradient
shaders[3] = new SweepGradient(160, 160, colors, null);
// 实例化ComposeShader
shaders[4] = new ComposeShader(shaders[1], shaders[2],
PorterDuff.Mode.DARKEN);
initEnent();
}
private void initEnent() {
findViewById(R.id.bitmap_shader).setOnClickListener(this);
findViewById(R.id.linear_gradient).setOnClickListener(this);
findViewById(R.id.radial_gradient).setOnClickListener(this);
findViewById(R.id.sweep_gradient).setOnClickListener(this);
findViewById(R.id.compose_shader).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bitmap_shader:
myView.paint.setShader(shaders[0]);
break;
case R.id.linear_gradient:
myView.paint.setShader(shaders[1]);
break;
case R.id.radial_gradient:
myView.paint.setShader(shaders[2]);
break;
case R.id.sweep_gradient:
myView.paint.setShader(shaders[3]);
break;
case R.id.compose_shader:
myView.paint.setShader(shaders[4]);
break;
}
myView.invalidate();
}
public class MyView extends View {
public Paint paint;
private Rect rect;
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
rect = new Rect(0, 0, getWidth(), getHeight());
canvas.drawRect(rect, paint);
}
}
}
2.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bitmap_shader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="位图平铺"/>
<Button
android:id="@+id/linear_gradient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="线性渐变"/>
<Button
android:id="@+id/radial_gradient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="圆形渐变"/>
<Button
android:id="@+id/sweep_gradient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="角度渐变"/>
<Button
android:id="@+id/compose_shader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="组合渲染"/>
</LinearLayout>
<com.example.matrixdemo.ShaderActivity.MyView
android:id="@+id/my_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>