Android BitmapShader 用法詳解

1、Shader簡介

Shader是一種光影效果,在通常的android開發中不經常使用,但有時倒是很是重要的一種技術手段php

  Android中提供了Shader類專門用來渲染圖像以及一些幾何圖形,Shader下面包括幾個直接子類,分別是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用來渲染圖像,LinearGradient 用來進行梯度渲染,RadialGradient 用來進行環形渲染,SweepGradient 用來進行梯度渲染,ComposeShader則是一個 混合渲染,能夠和其它幾個子類組合起來使用。 
    Shader類的使用,都須要先構建Shader對象,而後經過Paint的setShader方法設置渲染對象,而後設置渲染對象,而後再繪製時使用這個Paint對象便可。固然,用不一樣的渲染時須要構建不一樣的對象。  下面是一個簡單的示例,其實用起來比較簡單了 只是方法參數比較多。可是還比較容易理解。你們能夠去翻翻API 這裏就不深刻討論了,之後用到再說吧。html

 

2、代碼實戰 

package com.yarin.android.Examples_05_11;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Activity01 extends Activity {
	private GameView mGameView = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mGameView = new GameView(this);

		setContentView(mGameView);
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		super.onKeyUp(keyCode, event);
		return true;
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (mGameView == null) {
			return false;
		}
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			this.finish();
			return true;
		}
		return mGameView.onKeyDown(keyCode, event);
	}
}

View類android

package com.yarin.android.Examples_05_11;

import android.content.Context;
import android.graphics.Bitmap;
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.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View implements Runnable
{
	/* 聲明Bitmap對象 */
	Bitmap	mBitQQ	= null;
	int		BitQQwidth	= 0;
	int		BitQQheight	= 0;
	
	Paint   mPaint = null;
	     
	/* Bitmap渲染 */
	Shader mBitmapShader = null;
	
	/* 線性漸變渲染 */
	Shader mLinearGradient = null;
	
	/* 混合渲染 */
	Shader mComposeShader = null;
	   
	/* 喚醒漸變渲染 */
	Shader mRadialGradient = null;
	
	/* 梯度渲染 */
	Shader mSweepGradient = null;
	  
	
	ShapeDrawable mShapeDrawableQQ = null;
	  
	public GameView(Context context)
	{
		super(context);
		
		/* 裝載資源 */
		mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();

		/* 獲得圖片的寬度和高度 */
		BitQQwidth = mBitQQ.getWidth();
		BitQQheight = mBitQQ.getHeight();
		
		/* 建立BitmapShader對象 */
		mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
		
		/* 建立LinearGradient並設置漸變的顏色數組 說明一下這幾天參數 
		 * 第一個 起始的x座標
		 * 第二個 起始的y座標
                 * 第三個 結束的x座標
                 * 第四個 結束的y座標
		 * 第五個 顏色數組
		 * 第六個 這個也是一個數組用來指定顏色數組的相對位置 若是爲null 就沿坡度線均勻分佈
		 * 第七個 渲染模式
		 * */
		mLinearGradient = new LinearGradient(0,0,100,100,
											 new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
											 null,Shader.TileMode.REPEAT);
		/* 這裏理解爲混合渲染*/
		mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
		       
		/* 構建RadialGradient對象,設置半徑的屬性 */
		//這裏使用了BitmapShader和LinearGradient進行混合
		//固然也可使用其餘的組合
		//混合渲染的模式不少,能夠根據本身須要來選擇
		mRadialGradient = new RadialGradient(50,200,50,
											 new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},
											 null,Shader.TileMode.REPEAT);
		/* 構建SweepGradient對象 */
		mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);

		mPaint = new Paint();
		
		/* 開啓線程 */
		new Thread(this).start();
	}
	
	public void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		
		//將圖片裁剪爲橢圓形
		/* 構建ShapeDrawable對象並定義形狀爲橢圓 */
		mShapeDrawableQQ = new ShapeDrawable(new OvalShape());

		/* 設置要繪製的橢圓形的東西爲ShapeDrawable圖片 */
		mShapeDrawableQQ.getPaint().setShader(mBitmapShader);
		
		/* 設置顯示區域 */
		mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);
		
		/* 繪製ShapeDrawableQQ */
		mShapeDrawableQQ.draw(canvas); 		
		
		//繪製漸變的矩形
		mPaint.setShader(mLinearGradient);
		canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);
	        
		//顯示混合渲染效果
		mPaint.setShader(mComposeShader);
		canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);
		
		//繪製環形漸變
		mPaint.setShader(mRadialGradient);
		canvas.drawCircle(50, 200, 50, mPaint);
		
		//繪製梯度漸變
		mPaint.setShader(mSweepGradient);
		canvas.drawRect(150, 160, 300, 300, mPaint);
		
	}
	
	// 觸筆事件
	public boolean onTouchEvent(MotionEvent event)
	{
		return true;
	}


	// 按鍵按下事件
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		return true;
	}


	// 按鍵彈起事件
	public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		return false;
	}


	public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
	{
		return true;
	}
	
	
	/**
	 * 線程處理
	 */
	public void run()
	{
		while (!Thread.currentThread().isInterrupted())
		{
			try
			{
				Thread.sleep(100);
			}
			catch (InterruptedException e)
			{
				Thread.currentThread().interrupt();
			}
			//使用postInvalidate能夠直接在線程中更新界面
			postInvalidate();
		}
	}
}

 

對於動畫開發,Shader有時很是重要,特別的一種進度條動畫,文字上出現左右滑動的Shader效果canvas

 

3、關於基類BitmapShader

 

public   BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)數組

調用這個方法來產生一個畫有一個位圖的渲染器(Shader)。app

bitmap   在渲染器內使用的位圖ide

tileX      The tiling mode for x to draw the bitmap in.   在位圖上X方向花磚模式post

tileY     The tiling mode for y to draw the bitmap in.    在位圖上Y方向花磚模式動畫

 

TileMode:(一共有三種)this

CLAMP  :若是渲染器超出原始邊界範圍,會複製範圍內邊緣染色。

REPEAT :橫向和縱向的重複渲染器圖片,平鋪。

MIRROR :橫向和縱向的重複渲染器圖片,這個和REPEAT 重複方式不同,他是以鏡像方式平鋪。

仍是不太明白?那看一下效果圖吧!

package xiaosi.BitmapShader;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.View;

public class BitmapShaders extends View
{
    private  BitmapShader bitmapShader = null;
    private Bitmap bitmap = null;
    private Paint paint = null;
    private ShapeDrawable shapeDrawable = null;
    private int BitmapWidth  = 0;
    private int BitmapHeight = 0;
	public BitmapShaders(Context context)
	{
		super(context);
		//獲得圖像
		bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.h)).getBitmap();  
		BitmapWidth = bitmap.getWidth();
		BitmapHeight = bitmap.getHeight();
		//構造渲染器BitmapShader
		bitmapShader = new BitmapShader(bitmap,Shader.TileMode.MIRROR,Shader.TileMode.REPEAT);
	}
	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		//將圖片裁剪爲橢圓形  
	    //構建ShapeDrawable對象並定義形狀爲橢圓  
		shapeDrawable = new ShapeDrawable(new OvalShape());
		//獲得畫筆並設置渲染器
		shapeDrawable.getPaint().setShader(bitmapShader);
		//設置顯示區域
		shapeDrawable.setBounds(20, 20,BitmapWidth-60,BitmapHeight-60);
		//繪製shapeDrawable
		shapeDrawable.draw(canvas);
	}
}

參考:

http://www.php100.com/html/it/qianduan/2014/1226/8188.html

相關文章
相關標籤/搜索