Android - Shader图像渲染
2016-04-12 00:20
531 查看
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);
}
}
下面有大部分内容摘自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);
}
}
相关文章推荐
- Android自定义View过程解析
- Android自定义View软键盘实现搜索
- codeigniter中view通过循环显示数组数据的方法
- MVVM模式中ViewModel和View、Model有什么区别?
- Android应用开发中View绘制的一些优化点解析
- 自定义滑动按钮为例图文剖析Android自定义View绘制
- Android自定义View实现带数字的进度条实例代码
- Android重写View并自定义属性实例分析
- android开发教程之view组件添加边框示例
- Android动态添加View的问题解决方法
- Android viewpager中动态添加view并实现伪无限循环的方法
- Android自定义View之酷炫圆环(二)
- android获得当前view在屏幕中坐标的方法
- Android View如何测量
- 4种Android获取View宽高的方式
- Android获取屏幕或View宽度和高度的方法
- Android中将View的内容保存为图像的简单实例
- Android View移动的六种方法小结
- Android View添加 Listener 实例代码
- Android编程之View简单学习示例