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

更多相关文章

  1. Android中intent如何传递自定义数据类型
  2. CCRenderTexture 从后台进入前台变黑的处理(android)
  3. Android(安卓)网络通信框架Volley简介(Google IO 2013)
  4. Android(安卓)Bundle传递对象
  5. android与webService的数据传输---数据表=json
  6. android XMl 解析神奇xstream 二: 把对象转换成xml
  7. Android(安卓)渐变色沉浸式状态栏
  8. Android幻灯片式图片浏览器
  9. 使用Android中的Parcelable序列化对象

随机推荐

  1. 利用Python和OpenCV库将URL转换为OpenCV
  2. pycharm 之导入本地包
  3. 利用Python和OpenCV库将URL转换为OpenCV
  4. python使用opencv进行人脸识别
  5. PHP变量代码演示及简单函数演示
  6. php的运行原理和变量类型
  7. 使用 electron-builder 打包 Electron 程
  8. Python中使用OpenCV库来进行简单的气象学
  9. php变量的8种类型. 遍历php多维数组(forea
  10. 板绘如何体现金属质感?板绘金属质感绘画教