使用Shader填充图形

Shader本身是一个抽象类,它提供了如下实现类:

BitmapShader:使用位图平铺的渲染效果。

LinearGradient:使用线性渐变来填充图形。

RadialGradient:使用圆形渐变来填充图形。

SweepGradient:使用角度渐变来填充图形。

ComposeShader:使用组合渲染效果来填充图形。

下面通过一个实例来演示不同Shader的渲染效果:
Activity:
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>



 

你可能感兴趣的:(android,shader,图形填充)