Android - Shader图像渲染

 Shader类的使用

下面有大部分内容摘自http://blog.csdn.net/t12x3456/article/details/10418901

方法: 
1. boolean getLoaclMatrix(Matrix localM); 如果shader有一个非本地的矩阵将返回true.
    localM:如果不为null将被设置为shader的本地矩阵.
2. void setLocalMatrix(Matrix localM); 

    设置shader的本地矩阵,如果localM为空将重置shader的本地矩阵。  


Shader的直接子类:

BitmapShader    : 位图图像渲染

LinearGradient  : 线性渲染

RadialGradient  : 环形渲染

SweepGradient   : 扫描渐变渲染/梯度渲染

ComposeShader   : 组合渲染,可以和其他几个子类组合起来使用

是不是很像Animation及其子类的关系(AlphaAnimation,RotateAnimation,ScaleAnimation,TranslateAnimation, AnimationSet)

既有具体的渲染效果,也有渲染效果的组合


下面说下Shader的使用步骤:

1. 新建一个Shader对象

2. 通过Paint的setShader方法给画笔Paint添加渲染对象

3.设置渲染对象的属性

4.绘制时使用这个Paint对象


核心代码:

子View重写View的onSizeChanged方法,此方法主要完成一些初始化工作,大家可能有疑问为什么不把初始化代码放到构造方法中呢?你想啊,万一你的这个自定义View处于某种需求导致尺寸改变了,那么你获取的viewWidth肯定不再是之前的值了,所以我们应该检测自定义View的尺寸是否发生过变化,要是有变化,系统会自动调用onSizeChange方法,从而把初始化工作重新执行一遍。

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		// TODO Auto-generated method stub
		super.onSizeChanged(w, h, oldw, oldh);
		if(viewWidth==0){
			viewWidth = getMeasuredWidth();
			if(viewWidth>0){
				mPaint = new Paint();
				mPaint.setColor(getResources().getColor(android.R.color.holo_blue_dark));
				mPaint.setStyle(Paint.Style.FILL);
				mLinearGradient = new LinearGradient(0, 200, 200, 0, new int[]{Color.BLUE,Color.WHITE,Color.YELLOW,Color.RED}, null, TileMode.CLAMP);
				mPaint.setShader(mLinearGradient);
				mMatrix = new Matrix();
			}
			
		}
	}
重写View的onDraw方法

protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		if(mMatrix!=null){
			mTranslate += <span style="font-family: mceinline;">viewWidth</span><span style="font-family: mceinline;">/10;</span>
			if(mTranslate>400){
				mTranslate = -<span style="font-family: mceinline;">viewWidth</span>;
			}
			mMatrix.setTranslate(mTranslate, 0);
			mLinearGradient.setLocalMatrix(mMatrix);
			canvas.drawCircle(200, 200, 200, mPaint);
			postInvalidateDelayed(100);
		}
		
	}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值