知識點 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(mbitmapShader, mLinearGradient, PorterDuff.Mode.DARKEN);
/*構建mRadialGradient對象,並設置半徑的屬性*/
//new RadialGradient(x, y, radius, colors, positions, tile),圓心(參數1:x座標,參數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, bitQQWidth, bitQQHeight);
//繪製ShapeDrawable
mShapeDrawable.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);
}
}
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));
}