渲染

知识点

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(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));

    }

 

posted @ 2014-06-25 18:57  单方面  阅读(354)  评论(0编辑  收藏  举报