大家好,今天和大家分享的是Android中渲染图像和图形的类,这也是我第一次在Linux上写Android程序,呵呵,感觉还不错!

    切入正题:Shader有几个直接子类:

    BitmapShader : 图像渲染

    LinearGradient : 线性渐变

    RadialGradient : 环形渐变

    SweepGradient : 扫描渐变---围绕一个中心点扫描渐变就像电影里那种雷达扫描

    ComposeShader : 组合渲染

    先看效果图:


    先保存好你要在BitmapShader中显示的图片.

    看代码(代码中带有注释):

    我采用的还是SurefaceView框架,

    view plain
    1. packagecom.ldj.helloshader;
    2. importandroid.content.Context;
    3. importandroid.graphics.*;
    4. importandroid.graphics.Shader.TileMode;
    5. importandroid.graphics.drawable.BitmapDrawable;
    6. importandroid.graphics.drawable.ShapeDrawable;
    7. importandroid.graphics.drawable.shapes.OvalShape;
    8. importandroid.view.*;
    9. publicclassShaderViewextendsSurfaceViewimplementsSurfaceHolder.Callback,Runnable{
    10. //声明渐变的颜色数组
    11. privateint[]color=
    12. newint[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};
    13. privatebooleanloop=false;
    14. privateSurfaceHoldersurfaceHolder;
    15. privateBitmapbitPic=null;
    16. intbitPicWidth=0;
    17. intbitPicHeight=0;
    18. //声明一个图片渲染
    19. BitmapShaderbitmapShader=null;
    20. //声明一个线性渐变
    21. LinearGradientlinearGradient=null;
    22. //声明一个环形渐变
    23. RadialGradientradialGradient=null;
    24. //声明一个扫描渐变
    25. //-围绕一个中心点扫描渐变就像电影里那种雷达扫描
    26. SweepGradientsweepGradient=null;
    27. //声明一个组合渲染
    28. ComposeShadercomposeShader=null;
    29. //定义画笔
    30. Paintpaint=null;
    31. //利用这个类也可以实现绘制图像的功能
    32. ShapeDrawableshapeDrawable=null;
    33. publicShaderView(Contextcontext){
    34. super(context);
    35. surfaceHolder=this.getHolder();
    36. //增加回调
    37. surfaceHolder.addCallback(this);
    38. loop=true;
    39. paint=newPaint();
    40. //获取图像资源
    41. bitPic=
    42. ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))
    43. .getBitmap();
    44. //将图片的长和高的值赋给变量
    45. bitPicWidth=bitPic.getWidth();
    46. bitPicHeight=bitPic.getHeight();
    47. /*
    48. *~~~BitmapShader(Bitmap,TileMode,TileMode)~~~
    49. */
    50. bitmapShader=newBitmapShader(bitPic,TileMode.REPEAT,TileMode.MIRROR);
    51. /*
    52. *~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~
    53. */
    54. linearGradient=newLinearGradient(0,0,100,100,color,null,TileMode.REPEAT);
    55. /*
    56. *~~~RadialGradient~~~
    57. */
    58. radialGradient=newRadialGradient(160,240,66,color,null,TileMode.MIRROR);
    59. /*
    60. *~~~SweepGradient~~~
    61. */
    62. sweepGradient=newSweepGradient(100,350,color,null);
    63. //~~~ComposeShader(shaderA,shaderB,Mode)~~~
    64. //组合线性和环形两种渐变,当然其他的也可以的
    65. composeShader
    66. =newComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);
    67. }
    68. @Override
    69. publicvoidrun(){
    70. while(loop){
    71. draw();
    72. try{
    73. Thread.sleep(100);
    74. }catch(InterruptedExceptione){
    75. e.printStackTrace();
    76. }
    77. }
    78. }
    79. @Override
    80. publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,intarg3){
    81. }
    82. @Override
    83. publicvoidsurfaceCreated(SurfaceHolderarg0){
    84. newThread(this).start();
    85. }
    86. @Override
    87. publicvoidsurfaceDestroyed(SurfaceHolderarg0){
    88. loop=false;
    89. }
    90. privatevoiddraw(){
    91. Canvascanvas=surfaceHolder.lockCanvas();
    92. /*
    93. *~~~BitmapShader
    94. */
    95. //构造形状为椭圆的shapeDrawable对象
    96. shapeDrawable=newShapeDrawable(newOvalShape());
    97. //设置显示的图片
    98. shapeDrawable.getPaint().setShader(bitmapShader);
    99. //设置显示的长和高
    100. shapeDrawable.setBounds(0,0,bitPicWidth,bitPicHeight);
    101. //绘制图像
    102. shapeDrawable.draw(canvas);
    103. //~~~LinearGradient~~~
    104. //设置画笔的渲染类型
    105. paint.setShader(linearGradient);
    106. canvas.drawRect(0,bitPicHeight,320,150,paint);
    107. //~~~RadialGradient~~~
    108. paint.setShader(radialGradient);
    109. canvas.drawCircle(160,240,66,paint);
    110. //~~~SweepGradient
    111. paint.setShader(sweepGradient);
    112. canvas.drawCircle(100,350,66,paint);
    113. //~~~ComposeShader~~~
    114. paint.setShader(composeShader);
    115. canvas.drawRect(bitPicWidth,320,320,480,paint);
    116. surfaceHolder.unlockCanvasAndPost(canvas);
    117. }
    118. }

    总结:

    配色弄的不是很好看,大家可别见怪,大体来说渲染图像或图形三步:

    首先是声明渲染或渐变类。

    然后将画笔setShader为声明的类。

    最后绘制的时候用此画笔即可。

    好了,今天到这里了,谢谢大家阅读。


更多相关文章

  1. Android(安卓)Studio 布局中引用自定义属性不提示的问题
  2. 一行代码完成Android(安卓)7 FileProvider适配~
  3. Manifest.permission 这个类定义了android全部的权限共106个
  4. Android(安卓)RadialGradient 放射渲染
  5. android Shape使用(转)
  6. [Android记录]android中的shape
  7. Android(安卓)Shader 颜色、图像渲染 paint.setXfermode
  8. android开发学习积累(四)
  9. Android闪闪发光字体效果

随机推荐

  1. android 使用icon进行字符编码转换
  2. Android禁止横竖屏切换
  3. 在地图上画标注用到的资料
  4. Android/linux(earlysuspend、lateresume
  5. [置顶] android 长按和点击监听事件 谁先
  6. Android消息处理机制、Hanlder机制(Handle
  7. Android 检测键盘显示或隐藏键盘的实现代
  8. Android(安卓)开发遇到的问题
  9. Android的文件监控系统不可靠
  10. android屏幕触摸事件机制