android的shader渲染器

android里边的渲染器的使用主要是shader的子类,shader继承自object,他的子类有:

1、BitMapShader:BitMapShader 是bitmap渲染器,看名字就知道,

BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置、

这里我们只关注BitmapShader,构造方法:

mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);

参数1:bitmap

参数2,参数3:TileMode;

TileMode的取值有三种:

CLAMP 拉伸

REPEAT 重复

MIRROR 镜像

如果大家给电脑屏幕设置屏保的时候,如果图片太小,可以选择重复、拉伸、镜像;

重复:就是横向、纵向不断重复这个bitmap

镜像:横向不断翻转重复,纵向不断翻转重复;

拉伸:这个和电脑屏保的模式应该有些不同,这个拉伸的是图片最后的那一个像素;横向的最后一个横行像素,不断的重复,纵项的那一列像素,不断的重复;

现在大概明白了,BitmapShader通过设置给mPaint,然后用这个mPaint绘图时,就会根据你设置的TileMode,对绘制区域进行着色。

这里需要注意一点:就是BitmapShader是从你的画布的左上角开始绘制的,不在view的右下角绘制个正方形,它不会在你正方形的左上角开始。

2、LinearGradient:

线性渐变也是继承与shader:LinearGradient lg=new LinearGradien(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);

参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点,最后参数为平铺方式,这里设置为镜像

Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变,代码如下: mPaint.setShader(lg);

canvas.drawCicle(0,0,200,mPaint); //参数3为画圆的半径,类型为float型。

它除了定义开始颜色和结束颜色以外还可以定义,多种颜色组成的分段渐变效果

LinearGradient shader = new LinearGradient(0, 0, endX, endY, new int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, 1.0f}, TileMode.MIRROR);

其中参数new int[]{startColor, midleColor, endColor}是参与渐变效果的颜色集合,

其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置,

这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布

3、RadialGradient:

环形渲染:与上边的基本差不多

//创建环形渲染对象,选择重复模式

int mColorRadial[] = {Color.GREEN, Color.RED, Color.BLUE, Color.WHITE};

mRadialGradient = new RadialGradient(350, mBitmap.getHeight()*3/4+75, 75, mColorRadial, null,

Shader.TileMode.REPEAT);

4、ComposeShader:

组合渲染:他与上边的不同就是他可以包含俩种不同的渲染方式,然后将其组合。

mComposeShader = new ComposeShader(mLinearGradient, mRadialGradient,

PorterDuff.Mode.DARKEN);

5、SweepGradient:

梯形渲染:   //创建梯形渲染对象

int mColorSweep[] = {Color.GREEN, Color.RED, Color.BLUE, Color.YELLOW, Color.GREEN};

mSweepGradient = new SweepGradient(540, 750, mColorSweep, null);    //第一个参数是说你要     从x轴的什么位置开始渐变,  第二个是y轴 ,第三个是渐变颜数组,第四个是位置,可以指定渐变的绝对位置

还是看看代码吧:

package com.example.colorselect;

import android.annotation.SuppressLint;

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.Matrix;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.RadialGradient;

import android.graphics.RectF;

import android.graphics.Shader;

import android.graphics.SweepGradient;

import android.graphics.drawable.BitmapDrawable;

import android.view.View;

@SuppressLint({ "DrawAllocation", "DrawAllocation", "DrawAllocation" })

public class BitMapShaderView extends View  {

Bitmap mBitmap = null;                              //Bitmap对象

Shader mBitmapShader = null;               //Bitmap渲染对象

Shader mLinearGradient = null;             //线性渐变渲染对象

Shader mComposeShader = null;           //混合渲染对象

Shader mRadialGradient = null;             //环形渲染对象

Shader mSweepGradient = null;             //梯度渲染对象

/*   TileMode的取值有三种:

CLAMP 拉伸

REPEAT 重复

MIRROR 镜像*/

public BitMapShaderView(Context context) {

super(context);

//加载图像资源,获取到bitmap对象

mBitmap = ((BitmapDrawable) getResources().

getDrawable(R.drawable.mate5)).getBitmap();

//创建Bitmap渲染对象,选取了平铺 x轴 ,y轴重复        俩个属性

mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR,

Shader.TileMode.REPEAT);

//创建线性渲染对象,选择了平铺

int mColorLinear[] = {Color.RED, Color.GREEN, Color.BLUE, Color.WHITE};  //初始化渐变颜色的数组

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

Shader.TileMode.MIRROR);

//创建环形渲染对象,选择重复模式

int mColorRadial[] = {Color.GREEN, Color.RED, Color.BLUE, Color.WHITE};

mRadialGradient = new RadialGradient(350, mBitmap.getHeight()*3/4+75, 75, mColorRadial, null,

Shader.TileMode.REPEAT);

Shader LinearGradient = new LinearGradient(430, 800, 600, 1000, mColorLinear, null,

Shader.TileMode.MIRROR);

Shader RadialGradient = new RadialGradient(430, mBitmap.getHeight()*3/4+75, 75, mColorRadial, null,

Shader.TileMode.REPEAT);

//创建混合渲染对象

mComposeShader = new ComposeShader(mLinearGradient, mRadialGradient,

PorterDuff.Mode.DARKEN);

//创建梯形渲染对象

int mColorSweep[] = {Color.GREEN, Color.RED, Color.BLUE, Color.YELLOW, Color.GREEN};

mSweepGradient = new SweepGradient(540, 750, mColorSweep, null);    //第一个参数是说你要     从x轴的什么位置开始渐变,  第二个是y轴 ,第三个是渐变颜数组,第四个是位置,可以指定渐变的绝对位置

}

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

Paint mPaint = new Paint();

canvas.drawColor(Color.WHITE);      //背景置为灰色

float scale = 1.0f;

Matrix matrix =new Matrix();

// 拿到bitmap宽或高的小值

int bSize = Math.min(mBitmap.getWidth(), mBitmap.getHeight());

scale = 500 * 1.0f / bSize;

matrix.setScale(scale, scale);

mBitmapShader.setLocalMatrix(matrix);

//绘制Bitmap渲染的椭圆

mPaint.setShader(mBitmapShader);

canvas.drawRoundRect(new RectF(20, 20, mBitmap.getWidth()*3/4,

mBitmap.getHeight()*3/4),200,200, mPaint);

//绘制线性渐变的矩形

mPaint.setShader(mLinearGradient);

canvas.drawRect(10, mBitmap.getHeight()*3/4, 250,mBitmap.getHeight()*3/4+100, mPaint);

//绘制环形渐变的圆

mPaint.setShader(mRadialGradient);

canvas.drawCircle(350, mBitmap.getHeight()*3/4+75, 75, mPaint);

//绘制混合渐变(线性与环形混合)的矩形

mPaint.setShader(mComposeShader);

canvas.drawRect(430, 800, 600, 1000, mPaint);

//

//绘制梯形渐变的矩形

mPaint.setShader(mSweepGradient);

canvas.drawRect(430, 700, 630,800, mPaint);

}

}

demo下载地址:http://download.csdn.net/detail/u012808234/8597197

时间: 2024-11-05 18:52:49

android的shader渲染器的相关文章

Android Shader渲染器:BitmapShader

public class BitmapShader extends Shader BitmapShader,  Shader家族的 专门处理图片渲染的 构造方法: public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) bitmap:原图 tile直译为 瓷砖,瓦片.这里的TileMode 可看成是 铺图的模式. tileX, tileY:x/y 方向铺图的模式 public enum TileMode { CLAMP

Android中自定义视图View之---渲染器Shader对象

下面再来看下一个知识点:颜色渲染Shader对象 为什么我要把Shader对象单独拿出来说一下呢?因为这个对象在对于我们处理图形特效的时候是非常有用的 下面来看一下Android中Shader对象 在Android Api中关于颜色渲染的几个重要的类:Shader,BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient它们之间的关系是: Shader是后面几个类的父类 该类作为基类主要是返回绘制时颜色的横向跨度

通过渲染器Shader实现图像变换效果

在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是觉得自己学到的知识更多了呢?那么再多学一点总没坏处.在本篇文章中,将会一起学习通过给画笔设定Shader属性,实现图形变换.并带领读者一起实现两个实际例子,图片渲染器和线性渲染器.有没有发现我们的画笔特别强大呢??确实,我们曾经给它设置过颜色矩阵属性,设置过xfermode风格属性,现在又来设定Sh

Android学习笔记进阶15之Shader渲染

Android提供的Shader类主要是渲染图像以及一些几何图形. Shader有几个直接子类: BitmapShader    : 主要用来渲染图像 LinearGradient  :用来进行线性渲染 RadialGradient  : 用来进行环形渲染 SweepGradient   : 扫描渐变---围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染. ComposeShader   : 组合渲染,可以和其他几个子类组合起来使用. 1   BitmapShader 渲染器着色一个位

Android Shader渲染以及实现水波纹霓虹文字雷达等效果

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Android Shader渲染以及实现水波纹霓虹文字雷达等效果 - lzy的博客 - 博客频道 - CSDN.NET lzy的博客 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等到你!    &a

基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader

Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::createShaderProgram(const char* vsname, const char* psname) { std::string vShaderSource, fShaderSource; std::ifstream vShaderFile, fShaderFile; vShaderF

基于OpenGL编写一个简易的2D渲染框架-11 重构渲染器-Renderer

假如要渲染一个纯色矩形在窗口上,应该怎么做? 先确定顶点的格式,一个顶点应该包含位置信息 vec3 以及颜色信息 vec4,所以顶点的结构体定义可以这样: struct Vertex { Vec3 position; Vec4 color; }; 然后填充矩形四个顶点是数据信息: Vertex* data = ( Vertex* ) malloc(sizeof( Vertex ) * 4); data[0].position.set(0, 0, 0); data[1].position.set(

SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

上一篇文章分析了SDL更新纹理像素数据的函数SDL_UpdateTexture().这篇文章继续分析SDL的源代码.本文分析SDL纹理复制到渲染目标的函数SDL_RenderCopy(). SDL播放视频的代码流程如下所示.初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循

SDL2源代码分析3:渲染器(SDL_Renderer)

上一篇文章分析了SDL中创建窗口的函数SDL_CreateWindow().这篇文章继续分析SDL的源代码.本文分析SDL的渲染器(SDL_Renderer). SDL播放视频的代码流程如下所示. 初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据:  SDL_U