Android(安卓)渐变 -- Shader
16lz
2021-01-26
- packagecom.ldj.helloshader;
- importandroid.content.Context;
- importandroid.graphics.*;
- importandroid.graphics.Shader.TileMode;
- importandroid.graphics.drawable.BitmapDrawable;
- importandroid.graphics.drawable.ShapeDrawable;
- importandroid.graphics.drawable.shapes.OvalShape;
- importandroid.view.*;
- publicclassShaderViewextendsSurfaceViewimplementsSurfaceHolder.Callback,Runnable{
- //声明渐变的颜色数组
- privateint[]color=
- newint[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};
- privatebooleanloop=false;
- privateSurfaceHoldersurfaceHolder;
- privateBitmapbitPic=null;
- intbitPicWidth=0;
- intbitPicHeight=0;
- //声明一个图片渲染
- BitmapShaderbitmapShader=null;
- //声明一个线性渐变
- LinearGradientlinearGradient=null;
- //声明一个环形渐变
- RadialGradientradialGradient=null;
- //声明一个扫描渐变
- //-围绕一个中心点扫描渐变就像电影里那种雷达扫描
- SweepGradientsweepGradient=null;
- //声明一个组合渲染
- ComposeShadercomposeShader=null;
- //定义画笔
- Paintpaint=null;
- //利用这个类也可以实现绘制图像的功能
- ShapeDrawableshapeDrawable=null;
- publicShaderView(Contextcontext){
- super(context);
- surfaceHolder=this.getHolder();
- //增加回调
- surfaceHolder.addCallback(this);
- loop=true;
- paint=newPaint();
- //获取图像资源
- bitPic=
- ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))
- .getBitmap();
- //将图片的长和高的值赋给变量
- bitPicWidth=bitPic.getWidth();
- bitPicHeight=bitPic.getHeight();
- /*
- *~~~BitmapShader(Bitmap,TileMode,TileMode)~~~
- */
- bitmapShader=newBitmapShader(bitPic,TileMode.REPEAT,TileMode.MIRROR);
- /*
- *~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~
- */
- linearGradient=newLinearGradient(0,0,100,100,color,null,TileMode.REPEAT);
- /*
- *~~~RadialGradient~~~
- */
- radialGradient=newRadialGradient(160,240,66,color,null,TileMode.MIRROR);
- /*
- *~~~SweepGradient~~~
- */
- sweepGradient=newSweepGradient(100,350,color,null);
- //~~~ComposeShader(shaderA,shaderB,Mode)~~~
- //组合线性和环形两种渐变,当然其他的也可以的
- composeShader
- =newComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);
- }
- @Override
- publicvoidrun(){
- while(loop){
- draw();
- try{
- Thread.sleep(100);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- }
- }
- @Override
- publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,intarg3){
- }
- @Override
- publicvoidsurfaceCreated(SurfaceHolderarg0){
- newThread(this).start();
- }
- @Override
- publicvoidsurfaceDestroyed(SurfaceHolderarg0){
- loop=false;
- }
- privatevoiddraw(){
- Canvascanvas=surfaceHolder.lockCanvas();
- /*
- *~~~BitmapShader
- */
- //构造形状为椭圆的shapeDrawable对象
- shapeDrawable=newShapeDrawable(newOvalShape());
- //设置显示的图片
- shapeDrawable.getPaint().setShader(bitmapShader);
- //设置显示的长和高
- shapeDrawable.setBounds(0,0,bitPicWidth,bitPicHeight);
- //绘制图像
- shapeDrawable.draw(canvas);
- //~~~LinearGradient~~~
- //设置画笔的渲染类型
- paint.setShader(linearGradient);
- canvas.drawRect(0,bitPicHeight,320,150,paint);
- //~~~RadialGradient~~~
- paint.setShader(radialGradient);
- canvas.drawCircle(160,240,66,paint);
- //~~~SweepGradient
- paint.setShader(sweepGradient);
- canvas.drawCircle(100,350,66,paint);
- //~~~ComposeShader~~~
- paint.setShader(composeShader);
- canvas.drawRect(bitPicWidth,320,320,480,paint);
- surfaceHolder.unlockCanvasAndPost(canvas);
- }
- }
大家好,今天和大家分享的是Android中渲染图像和图形的类,这也是我第一次在Linux上写Android程序,呵呵,感觉还不错!
切入正题:Shader有几个直接子类:
BitmapShader : 图像渲染
LinearGradient : 线性渐变
RadialGradient : 环形渐变
SweepGradient : 扫描渐变---围绕一个中心点扫描渐变就像电影里那种雷达扫描
ComposeShader : 组合渲染
先看效果图:
先保存好你要在BitmapShader中显示的图片.
看代码(代码中带有注释):
我采用的还是SurefaceView框架,
view plain
总结:
配色弄的不是很好看,大家可别见怪,大体来说渲染图像或图形三步:
首先是声明渲染或渐变类。
然后将画笔setShader为声明的类。
最后绘制的时候用此画笔即可。
好了,今天到这里了,谢谢大家阅读。
更多相关文章
- Android(安卓)Studio 布局中引用自定义属性不提示的问题
- 一行代码完成Android(安卓)7 FileProvider适配~
- Manifest.permission 这个类定义了android全部的权限共106个
- Android(安卓)RadialGradient 放射渲染
- android Shape使用(转)
- [Android记录]android中的shape
- Android(安卓)Shader 颜色、图像渲染 paint.setXfermode
- android开发学习积累(四)
- Android闪闪发光字体效果