渲染

知識點 android

BitmapShader:位圖的渲染canvas

LinearGradient:線性渲染數組

ComposeShader:混合渲染app

RadialGradient: 環形渲染ide

SweepGradient:梯形渲染post

 

1.PorterDuff.Mode.CLEAR 所繪製不會提交到畫布上。this

2.PorterDuff.Mode.SRC 顯示上層繪製圖片 3spa

.PorterDuff.Mode.DST 顯示下層繪製圖片xml

4.PorterDuff.Mode.SRC_OVER 正常繪製顯示,上下層繪製疊蓋。對象

5.PorterDuff.Mode.DST_OVER 上下層都顯示。下層居上顯示。

6.PorterDuff.Mode.SRC_IN 取兩層繪製交集。顯示上層。 7.PorterDuff.Mode.DST_IN 取兩層繪製交集。顯示下層。 8.PorterDuff.Mode.SRC_OUT 取上層繪製非交集部分。 9.PorterDuff.Mode.DST_OUT 取下層繪製非交集部分。 10.PorterDuff.Mode.SRC_ATOP 取下層非交集部分與上層交集部分 11.PorterDuff.Mode.DST_ATOP 取上層非交集部分與下層交集部分 12.PorterDuff.Mode.XOR 取兩層繪製非交集。兩層繪製非交集。 13.PorterDuff.Mode.DARKEN 上下層都顯示。變暗 14.PorterDuff.Mode.LIGHTEN 上下層都顯示。變量

15.PorterDuff.Mode.MULTIPLY 取兩層繪製交集 16.PorterDuff.Mode.SCREEN 上下層都顯示。

 

 

代碼示例

packdage com.example.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.Shader.TileMode;

import android.graphics.SweepGradient;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.ShapeDrawable;

import android.graphics.drawable.shapes.OvalShape;

import android.view.View;

 

 

public class GameView extends View implements Runnable {

 

//聲明位圖對象

Bitmap bitQQ;

int bitQQWidth;

int bitQQHeight;

Paint mPaint;

 

//聲明一個渲染Shader

Shader mbitmapShader=null;

//聲明一個線性渲染

Shader mLinearGradient=null;

//聲明一個混合渲染

Shader mComposeShader=null;

//喚醒漸變渲染

Shader mRadialGradient=null;

//梯度渲染

Shader mSweepGradient=null;

 

//繪製基本圖形

ShapeDrawable mShapeDrawable=null;

 

public GameView(Context context) {

super(context);

// TODO Auto-generated constructor stub

//轉載資源

bitQQ=((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();

//獲得圖片的寬度和高度

bitQQHeight=bitQQ.getHeight();

bitQQWidth=bitQQ.getWidth();

 

//建立bitmapShader對象

/*

 * tileX  在位圖上X方向花磚模式

 * tileY  在位圖上y方向花磚模式

 * TileMode:(一共有三種)

 

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

 

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

 

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

 

 * */

mbitmapShader=new BitmapShader(bitQQ, TileMode.REPEAT, TileMode.MIRROR);

/*建立linearGradient並設置漸變顏色數組*/

/**

 * float x0: 漸變起始點x座標

 

float y0:漸變起始點y座標

 

 

float x1:漸變結束點x座標

 

 

float y1:漸變結束點y座標

 

 

int[] colors:顏色 的int 數組

 

 

float[] positions: 相對位置的顏色數組,可爲null,  若爲null,可爲null,顏色沿漸變線均勻分佈

 

 

Shader.TileMode tile: 渲染器平鋪模式

 

 * */

mLinearGradient=new LinearGradient(0, 0, 100, 100, 

new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE}, null, TileMode.REPEAT);

 

//這裏筆者理解爲混合渲染,其中PorterDuff.Mode.DARKEN模型是變暗

mComposeShader=new ComposeShader(mbitmapShadermLinearGradient, PorterDuff.Mode.DARKEN);

 

/*構建mRadialGradient對象,並設置半徑的屬性*/

//new RadialGradient(x, y, radius, colors, positions, tile),圓心(參數1x座標,參數2:y座標),參數3:變徑,參數6:模型

mRadialGradient =new RadialGradient(50, 200, 50, 

new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null, TileMode.REPEAT);

/*構建mSweepGradient對象,梯度渲染*/

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 run() {

// TODO Auto-generated method stub

while (!Thread.currentThread().isInterrupted()) {

try {

Thread.sleep(100);

catch (Exception e) {

// TODO: handle exception

Thread.currentThread().interrupt();

}

postInvalidate();

}

}

 

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

 

//將圖片裁剪爲橢圓形

mShapeDrawable=new ShapeDrawable(new OvalShape());

//設置要繪製橢圓形爲ShapeDrawable的圖片

mShapeDrawable.getPaint().setShader(mbitmapShader);

//設置顯示區域

mShapeDrawable.setBounds(0, 0, bitQQWidthbitQQHeight);

//繪製ShapeDrawable

mShapeDrawable.draw(canvas);

 

//繪製漸變矩形

mPaint.setShader(mLinearGradient);

canvas.drawRect(bitQQWidth,0, 320,  156, mPaint);

 

//顯示混合渲染效果

mPaint.setShader(mComposeShader);

canvas.drawRect(0, 300, bitQQWidth, 300+bitQQHeightmPaint);

 

//繪製環形漸變效果

mPaint.setShader(mRadialGradient);

canvas.drawCircle(50, 200, 50, mPaint);

 

//繪製梯度漸變效果

mPaint.setShader(mSweepGradient);

canvas.drawRect(150, 160, 300, 300, mPaint);

}

 

}

 

package com.example.examples_05_11;

 

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

 

public class MainActivity extends Activity {

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(new GameView(this));

    }

相關文章
相關標籤/搜索