大家好,今天和大家分享的是Android中渲染圖像和圖形的類,這也是我第一次在Linux上寫Android程序,呵呵,感覺還不錯!
切入正題:Shader有幾個直接子類:
BitmapShader : 圖像渲染
LinearGradient : 線性漸變
RadialGradient : 環形漸變
SweepGradient : 掃描漸變---圍繞一個中心點掃描漸變就像電影里那種雷達掃描
ComposeShader : 組合渲染
先看效果圖:

先保存好你要在BitmapShader中顯示的圖片.
看代碼(代碼中帶有注釋):
我采用的還是SurefaceView框架,
- package com.ldj.helloshader;
- import android.content.Context;
- import android.graphics.*;
- import android.graphics.Shader.TileMode;
- import android.graphics.drawable.BitmapDrawable;
- import android.graphics.drawable.ShapeDrawable;
- import android.graphics.drawable.shapes.OvalShape;
- import android.view.*;
- public class ShaderView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
- //聲明漸變的顏色數組
- private int[] color =
- new int[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};
- private boolean loop = false;
- private SurfaceHolder surfaceHolder;
-
- private Bitmap bitPic = null;
-
- int bitPicWidth = 0;
- int bitPicHeight = 0;
-
- //聲明一個圖片渲染
- BitmapShader bitmapShader = null;
- //聲明一個線性漸變
- LinearGradient linearGradient = null;
- //聲明一個環形漸變
- RadialGradient radialGradient = null;
- //聲明一個掃描漸變
- //-圍繞一個中心點掃描漸變就像電影里那種雷達掃描
- SweepGradient sweepGradient = null;
- //聲明一個組合渲染
- ComposeShader composeShader = null;
- //定義畫筆
- Paint paint = null;
- //利用這個類也可以實現繪制圖像的功能
- ShapeDrawable shapeDrawable = null;
-
- public ShaderView(Context context) {
- super(context);
- surfaceHolder = this.getHolder();
- //增加回調
- surfaceHolder.addCallback(this);
- loop = true;
- paint = new Paint();
- //獲取圖像資源
- bitPic =
- ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))
- .getBitmap();
- //將圖片的長和高的值賦給變量
- bitPicWidth = bitPic.getWidth();
- bitPicHeight = bitPic.getHeight();
- /*
- * ~~~BitmapShader(Bitmap,TileMode,TileMode)~~~
- */
- bitmapShader = new BitmapShader(bitPic, TileMode.REPEAT, TileMode.MIRROR);
- /*
- * ~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~
- */
- linearGradient = new LinearGradient(0,0,100,100,color,null,TileMode.REPEAT);
- /*
- * ~~~RadialGradient~~~
- */
- radialGradient = new RadialGradient(160,240,66,color,null,TileMode.MIRROR);
- /*
- * ~~~SweepGradient~~~
- */
- sweepGradient = new SweepGradient(100,350,color,null);
- //~~~ComposeShader(shaderA,shaderB,Mode)~~~
- //組合線性和環形兩種漸變,當然其他的也可以的
- composeShader
- = new ComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);
- }
- @Override
- public void run() {
- while(loop) {
- draw();
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
- }
- @Override
- public void surfaceCreated(SurfaceHolder arg0) {
- new Thread(this).start();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder arg0) {
- loop = false;
- }
-
- private void draw() {
- Canvas canvas = surfaceHolder.lockCanvas();
- /*
- * ~~~BitmapShader
- */
- //構造形狀為橢圓的shapeDrawable對象
- shapeDrawable = new ShapeDrawable(new OvalShape());
- //設置顯示的圖片
- shapeDrawable.getPaint().setShader(bitmapShader);
- //設置顯示的長和高
- shapeDrawable.setBounds(0, 0, bitPicWidth, bitPicHeight);
- //繪制圖像
- shapeDrawable.draw(canvas);
- //~~~LinearGradient~~~
- //設置畫筆的渲染類型
- paint.setShader(linearGradient);
- canvas.drawRect(0, bitPicHeight, 320, 150, paint);
- //~~~RadialGradient~~~
- paint.setShader(radialGradient);
- canvas.drawCircle(160, 240, 66, paint);
- //~~~SweepGradient
- paint.setShader(sweepGradient);
- canvas.drawCircle(100, 350, 66, paint);
- //~~~ComposeShader~~~
- paint.setShader(composeShader);
- canvas.drawRect(bitPicWidth, 320, 320, 480, paint);
- surfaceHolder.unlockCanvasAndPost(canvas);
- }
- }
總結:
配色弄的不是很好看,大家可別見怪,大體來說渲染圖像或圖形三步:
首先是聲明渲染或漸變類。
然后將畫筆setShader為聲明的類。
最后繪制的時候用此畫筆即可。
好了,今天到這里了,謝謝大家閱讀。