渲染
知识点
BitmapShader:位图的渲染
LinearGradient:线性渲染
ComposeShader:混合渲染
RadialGradient: 环形渲染
SweepGradient:梯形渲染
1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC 显示上层绘制图片 3
.PorterDuff.Mode.DST 显示下层绘制图片
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));
}