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-09-30 21:49:01

android的shader渲染器的相关文章

Android绘制音乐播放器示波器_Android

示波器是在大学的时候老师教的,但是出来工作一直没有用到过,渐渐的也就忘记了,现在重新学习一下.来看看效果图: 这里是一个自定义的柱状图,然后有一个按钮,点击按钮的时候,这里柱子会不停的运动,类似于音乐播放器里示波器的跳动. 跟前面几个自定义view的方式类似,重写了onSizeChange()方法和onDraw()方法 先列一下我们要用到的变量: /**画笔*/ private Paint mPaint; /**控件的宽度*/ private float mWidth; /**单个柱子的宽度*/

Android Html源文件查看器

项目源码下载 https://github.com/Wang-Jun-Chao/AndroidProjects Html源文件查看器 发送GET请求 URL url = URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod(); conn.setConnectTimeout(); conn.setReadTimeout(); (conn.getResp

android音乐播放器-Android关于音乐播放器频谱可视化图形的问题,急!

问题描述 Android关于音乐播放器频谱可视化图形的问题,急! 如上图,底部频谱可视化图形不会动了,不知道是什么原因造成的.首先我说下我目前知道的可能造成这种情况的事情.因为我的这个播放器里的播放列表这一项,要同步android系统媒体库里的播放列表.也就是说在系统的播放器中的播放列表会出现在我的播放器的播放列表中.本来我的包名是这样的:com.music.musicmenu 这样就不会出现上述问题,当我把包名改成系统的com.android.music 这时就会出现上述问题.也就是频谱不会动

jamendo_android 一个开源的Android在线音乐播放器实例

一个开源的Android在线音乐播放器实例.整套源码主要实现了专辑浏览,音乐在线播放,下载等等.虽说看起来功能不多,但是绝对十分具有参考价值,考虑的十分严谨.因为里面应用了网络通讯,json解析,全局mediaservice,自定义View组件,自定义 Adapter,application全局缓存,变量等等,所有要在项目中考虑到的优化问题. 项目主页:http://www.open-open.com/lib/view/home/1344734233116

android 写网络图片查看器,代码看不出错,但就是结果不对,新手求帮助,帮忙挑挑错。

问题描述 android 写网络图片查看器,代码看不出错,但就是结果不对,新手求帮助,帮忙挑挑错. 我反复检查了好几遍,感觉写的都正确.就是运行时没结果. 我打算访问的图片是自己创建的web工程上的图片,访问的地址也把localhost改为了相应的ip地址(ip是通过cmd->ipconfig查询得到) 我也添加了网络访问权限. 个人感觉不是布局导致的问题,因为程序运行后,那个吐司的报错一直都显示.如果是布局有问题,最多看不到图片. 感觉把该注意的问题都注意到了,但是还是运行有问题,希望各位大大

swing-关于JTable渲染器Renderer的问题,求高手解答!!!!

问题描述 关于JTable渲染器Renderer的问题,求高手解答!!!! public class MyButtonRender implements TableCellRenderer { private JPanel panel; private JButton add,reduce; private JTextField numbertf; public MyButtonRender() { this.initAdd(); this.initReduce(); this.initNumb

android做音乐播放器,为什么都用aidl呢,bindservice不也可以么?

问题描述 android做音乐播放器,为什么都用aidl呢,bindservice不也可以么? android做音乐播放器,为什么都用aidl呢,bindservice不也可以么? 解决方案 bindservice是与activity绑定的.如果acitivity退出的话,service也就销毁了,无法后台播放.当然,可以用startservice

控件-Android的电子书阅读器的内容显示

问题描述 Android的电子书阅读器的内容显示 请问如何显示大量文字,而且中间有的时候某些字需要有类似加粗.下划线的处理, 类似与注释,请问是用Textview来来显示吗?如果textview的话需要注释的时候是多个控件来显示吗?例如 Textview+可点击的Textview+Textview 请好心人帮帮忙吧 解决方案 textview支持html的,这样可以让内容丰富些 解决方案二: 看我的博客:http://blog.csdn.net/u012573920/article/detail

android开发之文件管理器

问题描述 android开发之文件管理器 android开发之如何调用系统文件管理器跳转到sd卡指定目录?