关于 android的 渲染器 Shader
因为公司在 自定义的画图上面比较苛刻(各种要求= =),最后又是改来改去的。反正是 Shader起到很大作用,特此记录一下下、在achartengine的基础上没有能满足他们= =
androd 提供了Shader类专门用来渲染图像以及一些几何图形。
自己写个class 继承 Vew
1.bitmap渲染器效果
2.线性渲染器效果
3.环形渲染器效果
4.混合渲染器效果
5.梯度渲染器效果
好了,下来直接放代码吧。注释都很清晰的说, 想要调整各种效果自己调整 X,Y 和type就好
public class MyShaderView extends View {
// Shader渲染器 下面的都继承于 Shader 供了Shader类专门用来渲染图像以及一些几何图形。
BitmapShader bitmapShader; //bitmap渲染器
ComposeShader composeShader; //混合渲染器
LinearGradient linearGradient; //线性渲染
RadialGradient radialGradient; //圆形那种环形渲染
SweepGradient sweepGradient; //梯度渲染器
int width;
int height;
public MyShaderView(Context context) {
super(context);
//用 bitmap先渲染1个图片吧= =
//先得到图片 drawable - bitmapDrawable
BitmapDrawable bitmap_deawable = (BitmapDrawable) getResources().getDrawable(R.drawable.yingkou);
//再得到 bitmap
Bitmap bitmap = bitmap_deawable.getBitmap();
width = bitmap.getWidth();
height = bitmap.getHeight();
//*******************************开始渲染bitmap图片
// new BitmapShader(bitmap, tileX, tileY)
// tileX The tiling mode for x to draw the bitmap in. 在位图上X方向花砖模式
// tileY The tiling mode for y to draw the bitmap in. 在位图上Y方向花砖模式
// CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。
// REPEAT :横向和纵向的重复渲染器图片,平铺。
// MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR);
//******************************* LinearGradient 线性渲染
// LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode);
// X0: 渐变起初点坐标x位置
// y0: 渐变起初点坐标y位置
// x1: 渐变终点坐标x位置
// y1: 渐变终点坐标y位置
// colors: 渐变颜色数组
// positions:这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布
// tile:渲染模式(平铺方式)
linearGradient = new LinearGradient(50, 50,1000,1000, new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE},
null,Shader.TileMode.REPEAT);
//******************************* radialGradient 环形渲染
// x y 半径 渐变颜色数组 position 平铺方式
//多色
radialGradient = new RadialGradient( 50,200,50,new int[]{Color.WHITE,Color.YELLOW,Color.GREEN,Color.RED,Color.BLUE,},
null,Shader.TileMode.REPEAT);
//单色 + 边框- 这个真心是应了 需求。。必须实心-为的是不露出后面的东西(paint本身画出来的设置空心会漏)
//radialGradient = new RadialGradient( 50,200, 50, new int[]
//{Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,
//Color.WHITE,Color.RED},
//null,Shader.TileMode.REPEAT);
//******************************* composeShader 混合渲染
composeShader = new ComposeShader(bitmapShader,linearGradient,PorterDuff.Mode.DARKEN);
//最后的 混合渲染模式有 PorterDuff.Mode有16种参数可供选择,下面有效果图
//分别为:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、
// SRC_ATOP、DST_ATOP、 XOR、DARKEN、LIGHTEN、MULTIPLY、SCREEN。
//******************************* sweepGradient 梯度渲染器
sweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//构建ShapeDrawable对象并定义形状为椭圆
// RectShape
// ArcShape
// RectShape
//1.可以这样写
//ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//得到画笔并设置渲染器
// shapeDrawable.getPaint().setShader(bitmapShader);
//设置显示区域
// shapeDrawable.setBounds(20, 20, width-10, height-10);
//绘制shapeDrawable
// shapeDrawable.draw(canvas);
// 2.也可以这样写
Paint paint = new Paint();
canvas.drawColor(Color.WHITE); //背景置为灰色
//绘制Bitmap渲染的椭圆
paint.setShader(bitmapShader);
canvas.drawOval(new RectF(90, 20, 90+ width, 20+ height), paint);
//绘制线性渐变的矩形
paint.setShader(linearGradient);
canvas.drawRect(10, 200, 200, 400, paint);
//绘制环形渐变的圆
paint.setShader(radialGradient);
canvas.drawCircle(50,200,50, paint);
//绘制混合渐变(线性与环形混合)的矩形
paint.setShader(composeShader);
canvas.drawRect(0, 0, 1000, 1000, paint);
//绘制梯形渐变的矩形
paint.setShader(sweepGradient);
canvas.drawRect(50, 50, 300, 300, paint);
}
}
下面这张图是上面提到的混合 渲染器,16个每种type的样式
关于 android的 渲染器 Shader的更多相关文章
- Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)
Android渲染器Shader:环状放射渐变渲染器RadialGradient(三) Android RadialGradient渲染器提供一种环状.发散.放射形状的渐变渲染器. 写一个例子: ...
- Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二) 附录文章1介绍了线性渐变渲染器. Android的SweepGradient梯度渐变扫描,重点是在构造Swe ...
- Android渲染器Shader:LinearGradient(一)
Android渲染器Shader:LinearGradient(一) LinearGradient是Android的线性渲染器.我写5个LinearGradient渲染器渲染后的View表现结果 ...
- 通过渲染器Shader实现图像变换效果
在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是 ...
- 渲染器 Shader BitmapShader
渲染模式: tileX tileY:The tiling mode for x/y to draw the bitmap in. 在位图上 X/Y 方向 瓦工/花砖/瓷砖 模式 CLAMP :如 ...
- 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader
Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...
- Android 颜色渲染(三) Shader颜色渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. 相信看过在上一篇中提到的三篇文章后,大家已经对颜色处理方面有更深的体会. 之前讲到颜色渐变的效果, 具体怎么做呢,这就需要应用颜色渲染. 首先要介 ...
- Android学习笔记12:图像渲染(Shader)
在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...
- android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器
BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...
随机推荐
- win8 hyper-v 禁用不必卸载虚拟机
转载:http://tylzwp.blogbus.com/logs/232938121.html 禁用hyperv的目的是使用之前在用的VMware的虚拟机,不必重新处理一遍. 具体操作: 1确报之前 ...
- Django admin site(一)ModelAdmin Options
Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 要使用admin,可以按照下面的步骤: 将'dj ...
- PHP判断日期是不是今天 判断日期是否为当天
<?php /** * PHP判断一个日期是不是今天 * 琼台博客 */ echo '<meta charset="utf-8" />'; // 拟设一个日期 $ ...
- Android 签名(4)验证是否签名
判断Apk是否签名 用命令:jarsigner -verify XXX.apk 增加 -verbose -certs 两个选项可显示更多信息. 如果有Android Debug字樣就是debug 如 ...
- 【HDOJ】4412 Sky Soldiers
1. 题目描述有$k$个伞兵跳伞,有$m$个汇点.当伞兵着陆后,需要走向离他最近的汇点.如何选择这$m$个结点,可以使得士兵最终行走的距离的期望最小.求这个最小的期望. 2. 基本思路假设已经选好了这 ...
- 【HDOJ】4579 Random Walk
1. 题目描述一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路显然是个DP.公式推导也相当容易.不妨设$dp ...
- Android开发之 android:windowSoftInputMode属性详解
android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...
- Eclipse搭建Struts框架,及一个简单的Struts例子
一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包含了开发struts2所需的 ...
- poj 3278 Catch That Cow (bfs)
题目:http://poj.org/problem?id=3278 题意: 给定两个整数n和k 通过 n+1或n-1 或n*2 这3种操作,使得n==k 输出最少的操作次数 #include<s ...
- 记一次SSH登陆失败问题的定位
创建用户之后,使用ssh协议登陆提示失败. useradd -d /home/hdp -m hdp -g dba -s /bin/bash 通过命令 ssh -v hdp@127.0.0.1 登陆,查 ...