Shader本身是一个抽象类,它提供了如下实现类:
BitmapShader:使用位图平铺的渲染效果。
LinearGradient:使用线性渐变来填充图形。
RadialGradient:使用圆形渐变来填充图形。
SweepGradient:使用角度渐变来填充图形。
ComposeShader:使用组合渲染效果来填充图形。
下面通过一个实例来演示不同Shader的渲染效果:package comlovo.testshader; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Color; import android.graphics.ComposeShader; import android.graphics.LinearGradient; import android.graphics.PorterDuff; import android.graphics.RadialGradient; import android.graphics.Shader; import android.graphics.Shader.TileMode; import android.graphics.SweepGradient; import android.os.Bundle; import android.view.View; import com.lovo.view.MyView; public class MainActivity extends Activity { // 声明位图渲染对象 private Shader[] shaders = new Shader[5]; // 声明颜色数组 private int[] colors; MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.activity_main_my_view); // 获得Bitmap实例 Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); // 设置渐变的颜色组 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); } public void click(View v) { switch (v.getId()) { case R.id.activity_main_btn1: myView.paint.setShader(shaders[0]); break; case R.id.activity_main_btn2: myView.paint.setShader(shaders[1]); break; case R.id.activity_main_btn3: myView.paint.setShader(shaders[2]); break; case R.id.activity_main_btn4: myView.paint.setShader(shaders[3]); break; case R.id.activity_main_btn5: myView.paint.setShader(shaders[4]); break; } // 重绘界面 myView.invalidate(); } }
自定义组件类:
package com.lovo.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class MyView extends View { public Paint paint; public MyView(Context context, AttributeSet attrs) { super(context, attrs); // 设置画笔的颜色 paint = new Paint(); paint.setColor(Color.RED); // 设置画笔风格 paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(3); // 去锯齿 paint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); canvas.drawRect(150, 200, 400, 450, paint); } }
布局XML:
<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/activity_main_btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="位图" /> <Button android:id="@+id/activity_main_btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="线性渐变" /> <Button android:id="@+id/activity_main_btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="圆形渐变" /> <Button android:id="@+id/activity_main_btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="角度渐变" /> <Button android:id="@+id/activity_main_btn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="混合" /> </LinearLayout> <com.lovo.view.MyView android:id="@+id/activity_main_my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>