android shader 用法
转自 http://blog.csdn.net/abcdef314159
http://blog.csdn.net/aigestudio/article/details/41799811
Shader渲染Android提供了5个子类,有BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient。Shader中有一个TileMode,共有3种模式,
CLAMP:当图片小于绘制尺寸时要进行边界拉伸来填充
REPEAT:当图片小于绘制尺寸时重复平铺
MIRROR:当图片小于绘制尺寸时镜像平铺
我们先来看一下BitmapShader,
- public class ShaderView extends View {
- private Bitmap mBitmap;
- private Shader mBitmapShader = null;
- private Paint mPaint;
- public ShaderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
- mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT,
- Shader.TileMode.MIRROR);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setShader(mBitmapShader);
- canvas.drawRect(0, 0, mBitmap.getWidth() * 4, mBitmap.getHeight() * 4,
- mPaint);
- }
- }
运行结果为
我们看到左右平铺,上下镜像,在来改一下,只需要把上面的mBitmapShader改一下就可
- mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
- Shader.TileMode.MIRROR);
看到上下镜像,左右拉伸,再来看一下LinearGradient
- public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[],
- TileMode tile)
float x0 :渐变的x坐标起点
float y0 :渐变的y坐标起点
float x1 :渐变的x坐标终点
float y1 :渐变的y坐标终点
int colors[]:渐变的颜色数组
float positions[]:颜色的相对位置
TileMode tile:上面的3种模式
- public class ShaderView extends View {
- private Shader mLinearGradient = null;
- private Paint mPaint;
- public ShaderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mLinearGradient = new LinearGradient(0, 0, 100, 100, new int[] {
- Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE },
- new float[] { 0, .1F, .8F, .9F }, Shader.TileMode.REPEAT);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setShader(mLinearGradient);
- canvas.drawRect(0, 0, 900, 1000, mPaint);
- }
- }
我们看到上面的小数数组是渐变的相对位置,如果positions为空,这均匀分布,修改一下
- mLinearGradient = new LinearGradient(0, 0, 100, 100, new int[] {
- Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE }, null,
- Shader.TileMode.REPEAT);
再来修改一下模式,因为最后一个是白色容易和手机屏幕混淆,所以添加了一个绿色
- mLinearGradient = new LinearGradient(0, 0, 100, 100,
- new int[] { Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE,
- Color.GREEN }, null, Shader.TileMode.CLAMP);
我们看到最后一个颜色是拉伸,再修改一下
- mLinearGradient = new LinearGradient(0, 0, 100, 100,
- new int[] { Color.RED, Color.YELLOW, Color.BLACK, Color.WHITE,
- Color.GREEN }, null, Shader.TileMode.MIRROR);
镜像模式,所以感觉有点对称。在看一下LinearGradient的另一个构造方法,
- LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,
- TileMode tile)
其中color0是颜色的起始点,color1是颜色的终止点,我们就演示一个看看
- mLinearGradient = new LinearGradient(0, 0, 100, 100, Color.RED,
- Color.YELLOW, Shader.TileMode.MIRROR);
再来看一下RadialGradient
- RadialGradient(float x, float y, float radius,
- int colors[], float positions[], TileMode tile)
它实现的是环形渐变,
x:渐变的中心x坐标
y:渐变的中心y坐标
radius:渐变的半径
colors:梯度渐变的颜色数组
positions:和LinearGradient类似,用来指定颜色数组的相对位置
- public class ShaderView extends View {
- private Shader mRadialGradient = null;
- private Paint mPaint;
- public ShaderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
- Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
- Shader.TileMode.REPEAT);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setShader(mRadialGradient);
- canvas.drawRect(0, 0, 900, 1000, mPaint);
- }
- }
运行结果如上,再来修改一下
- mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
- Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
- Shader.TileMode.CLAMP);
再来修改一下
- mRadialGradient = new RadialGradient(200, 400, 100, new int[] {
- Color.YELLOW, Color.RED, Color.BLUE, Color.GREEN }, null,
- Shader.TileMode.MIRROR);
还有个构造方法,这里就不在演示
- RadialGradient(float x, float y, float radius,
- int color0, int color1, TileMode tile)
下面看一下SweepGradient
- SweepGradient(float cx, float cy,
- int colors[], float positions[])
cx,cy:扫描中心的x,y坐标
colors:渐变的数组颜色
positions:渐变的相对位置
- public class ShaderView extends View {
- private Shader mSweepGradient = null;
- private Paint mPaint;
- public ShaderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mSweepGradient = new SweepGradient(400, 400, new int[] { Color.YELLOW,
- Color.RED, Color.BLUE, Color.GREEN }, new float[] { 0, .2F,
- .6F, .9F });
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setShader(mSweepGradient);
- canvas.drawCircle(400, 400, 300, mPaint);
- }
- }
还有最后一个ComposeShader,这个是组合的Shader
- public class ShaderView extends View {
- private Shader mSweepGradient = null;
- private Shader mBitmapShader = null;
- private Shader mComposeShader = null;
- private Paint mPaint;
- private Bitmap mBitmap;
- public ShaderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
- mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT,
- Shader.TileMode.MIRROR);
- mSweepGradient = new SweepGradient(mBitmap.getWidth() * 2,
- mBitmap.getWidth() * 2, new int[] { Color.YELLOW,
- Color.RED, Color.BLUE, Color.GREEN }, new float[] { 0, .2F,
- .6F, .9F });
- mComposeShader = new ComposeShader(mBitmapShader, mSweepGradient,
- PorterDuff.Mode.DARKEN);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setShader(mComposeShader);
- canvas.drawRect(0, 0, mBitmap.getWidth() * 4, mBitmap.getHeight() * 4,
- mPaint);
- }
- }
android shader 用法的更多相关文章
- Android Meun 用法
Android Meun 用法 点击菜单实体键弹出菜单:如下图 main_activity.xml <?xml version="1.0" encoding="ut ...
- Android ViewPager 用法
Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...
- Android Intent 用法全面总结
[代码全屏查看]-Android Intent 用法全面总结 // [1].[代码] 调用拨号程序 跳至 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] / ...
- Android GLSurfaceView用法详解(二)
输入如何处理 若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...
- Android ScrollView用法
Android ScrollView用法 今天试着使用了一下Android的滚轮,以下是一个小小的测试,读取测试文件,主要是使用scrollTo函数和getScrollY(),程序点击BUTTON按钮 ...
- Android Service用法知识点的讲解
Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...
- Android Fragment用法知识点的讲解
Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...
- Android spannableStringBuilder用法整理
Android spannableStringBuilder用法整理 分类: Android开发2013-11-29 10:58 5009人阅读 评论(0) 收藏 举报 Androidspannabl ...
- Android Fragment用法详解(2)--动态添加Fragment
在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...
随机推荐
- Android菜鸟成长记14 -- AsnyTask
本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...
- Linux 下的dd命令使用详解(摘录)
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- STM32 使用 FreeRTOS过程记录
资源:http://blog.csdn.net/zhzht19861011/article/category/6191478 资源:可以下载安富莱的STM32-V5开发版资料中的FreeRTOS教程, ...
- Android下载图片/调用系统相机拍照、显示并保存到本地
package com.example.testhttpget; import java.io.BufferedReader; import java.io.FileNotFoundException ...
- HTML5离线篇收藏--- cache manifest
自从翻译了<解读 HTML5:建议.技巧和技术>,就一直没有时间去看 HTML5 相关的东西.上周一次偶然的工作间隙折腾了下 Cache Manifest .当时直接拿博客当测试环境,虽然 ...
- NGUI 使用EventDelegate.Add与UIInput.onSubmit、UIInput.onChange限定编辑框中的内容
Unity中,使用NGUI,通常为某个控件(如按钮)绑定事件(单击.双击.拖拽.滚轮.选择等)都是用UIEventListener,比如: public void Bind() { UIEventLi ...
- 第1周 支路变量、元件、KCL和KVL
第1周的内容,介绍了: 电阻.独立源.受控元件等实体元器件, 电流.电压.功率等抽象名词, 端口.参考方向等分析时的概念工具, KCL.KVL两大分析定律, 解线性电路的普适方法----2B法. 引入 ...
- bootstarp-table表格中嵌套多个BUTON按钮实现
bootstarp-table表格中嵌套多个BUTON按钮实现 有时我们需要在bootsharp-table表格中嵌套多个按钮,来实现不同的功能,大概界面如下: 实现功能如下: 1:构建表格 ...
- 浅谈Oracle表之间各种连接
Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...
- js的form基础知识点
在HTML 中,表单是由<form>元素来表示的,而在JavaScript 中,表单对应的则是HTMLForm-Element 类型.HTMLFormElement 继承了HTMLElem ...