Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用。
Shader类的使用,都需要先构建Shader对象,然后通过Paint的setShader方法设置渲染对象,然后设置渲染对象,然后再绘制时使用这个Paint对象即可。当然,用不同的渲染时需要构建不同的对象。 下面是一个简单的示例,其实用起来比较简单了 只是方法参数比较多。但是还比较容易理解。大家可以去翻翻API 这里就不深入讨论了,以后用到再说吧。

android Shader类简介_渲染图像_第1张图片

Activity01
Java代码 复制代码 收藏代码
  1. packagecom.yarin.android.Examples_05_11;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.KeyEvent;
  5. publicclassActivity01extendsActivity{
  6. privateGameViewmGameView=null;
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. mGameView=newGameView(this);
  11. setContentView(mGameView);
  12. }
  13. publicbooleanonKeyUp(intkeyCode,KeyEventevent){
  14. super.onKeyUp(keyCode,event);
  15. returntrue;
  16. }
  17. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  18. if(mGameView==null){
  19. returnfalse;
  20. }
  21. if(keyCode==KeyEvent.KEYCODE_BACK){
  22. this.finish();
  23. returntrue;
  24. }
  25. returnmGameView.onKeyDown(keyCode,event);
  26. }
  27. }


GameView
Java代码 复制代码 收藏代码
  1. packagecom.yarin.android.Examples_05_11;
  2. importandroid.content.Context;
  3. importandroid.graphics.Bitmap;
  4. importandroid.graphics.BitmapShader;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Color;
  7. importandroid.graphics.ComposeShader;
  8. importandroid.graphics.LinearGradient;
  9. importandroid.graphics.Paint;
  10. importandroid.graphics.PorterDuff;
  11. importandroid.graphics.RadialGradient;
  12. importandroid.graphics.Shader;
  13. importandroid.graphics.SweepGradient;
  14. importandroid.graphics.drawable.BitmapDrawable;
  15. importandroid.graphics.drawable.ShapeDrawable;
  16. importandroid.graphics.drawable.shapes.OvalShape;
  17. importandroid.view.KeyEvent;
  18. importandroid.view.MotionEvent;
  19. importandroid.view.View;
  20. publicclassGameViewextendsViewimplementsRunnable
  21. {
  22. /*声明Bitmap对象*/
  23. BitmapmBitQQ=null;
  24. intBitQQwidth=0;
  25. intBitQQheight=0;
  26. PaintmPaint=null;
  27. /*Bitmap渲染*/
  28. ShadermBitmapShader=null;
  29. /*线性渐变渲染*/
  30. ShadermLinearGradient=null;
  31. /*混合渲染*/
  32. ShadermComposeShader=null;
  33. /*唤醒渐变渲染*/
  34. ShadermRadialGradient=null;
  35. /*梯度渲染*/
  36. ShadermSweepGradient=null;
  37. ShapeDrawablemShapeDrawableQQ=null;
  38. publicGameView(Contextcontext)
  39. {
  40. super(context);
  41. /*装载资源*/
  42. mBitQQ=((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();
  43. /*得到图片的宽度和高度*/
  44. BitQQwidth=mBitQQ.getWidth();
  45. BitQQheight=mBitQQ.getHeight();
  46. /*创建BitmapShader对象*/
  47. mBitmapShader=newBitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
  48. /*创建LinearGradient并设置渐变的颜色数组说明一下这几天参数
  49. *第一个起始的x坐标
  50. *第二个起始的y坐标
  51. *第三个结束的x坐标
  52. *第四个结束的y坐标
  53. *第五个颜色数组
  54. *第六个这个也是一个数组用来指定颜色数组的相对位置如果为null就沿坡度线均匀分布
  55. *第七个渲染模式
  56. **/
  57. mLinearGradient=newLinearGradient(0,0,100,100,
  58. newint[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
  59. null,Shader.TileMode.REPEAT);
  60. /*这里理解为混合渲染*/
  61. mComposeShader=newComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
  62. /*构建RadialGradient对象,设置半径的属性*/
  63. //这里使用了BitmapShader和LinearGradient进行混合
  64. //当然也可以使用其他的组合
  65. //混合渲染的模式很多,可以根据自己需要来选择
  66. mRadialGradient=newRadialGradient(50,200,50,
  67. newint[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},
  68. null,Shader.TileMode.REPEAT);
  69. /*构建SweepGradient对象*/
  70. mSweepGradient=newSweepGradient(30,30,newint[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
  71. mPaint=newPaint();
  72. /*开启线程*/
  73. newThread(this).start();
  74. }
  75. publicvoidonDraw(Canvascanvas)
  76. {
  77. super.onDraw(canvas);
  78. //将图片裁剪为椭圆形
  79. /*构建ShapeDrawable对象并定义形状为椭圆*/
  80. mShapeDrawableQQ=newShapeDrawable(newOvalShape());
  81. /*设置要绘制的椭圆形的东西为ShapeDrawable图片*/
  82. mShapeDrawableQQ.getPaint().setShader(mBitmapShader);
  83. /*设置显示区域*/
  84. mShapeDrawableQQ.setBounds(0,0,BitQQwidth,BitQQheight);
  85. /*绘制ShapeDrawableQQ*/
  86. mShapeDrawableQQ.draw(canvas);
  87. //绘制渐变的矩形
  88. mPaint.setShader(mLinearGradient);
  89. canvas.drawRect(BitQQwidth,0,320,156,mPaint);
  90. //显示混合渲染效果
  91. mPaint.setShader(mComposeShader);
  92. canvas.drawRect(0,300,BitQQwidth,300+BitQQheight,mPaint);
  93. //绘制环形渐变
  94. mPaint.setShader(mRadialGradient);
  95. canvas.drawCircle(50,200,50,mPaint);
  96. //绘制梯度渐变
  97. mPaint.setShader(mSweepGradient);
  98. canvas.drawRect(150,160,300,300,mPaint);
  99. }
  100. //触笔事件
  101. publicbooleanonTouchEvent(MotionEventevent)
  102. {
  103. returntrue;
  104. }
  105. //按键按下事件
  106. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  107. {
  108. returntrue;
  109. }
  110. //按键弹起事件
  111. publicbooleanonKeyUp(intkeyCode,KeyEventevent)
  112. {
  113. returnfalse;
  114. }
  115. publicbooleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)
  116. {
  117. returntrue;
  118. }
  119. /**
  120. *线程处理
  121. */
  122. publicvoidrun()
  123. {
  124. while(!Thread.currentThread().isInterrupted())
  125. {
  126. try
  127. {
  128. Thread.sleep(100);
  129. }
  130. catch(InterruptedExceptione)
  131. {
  132. Thread.currentThread().interrupt();
  133. }
  134. //使用postInvalidate可以直接在线程中更新界面
  135. postInvalidate();
  136. }
  137. }
  138. }

更多相关文章

  1. android中能不能new Activity()对象引发的思考
  2. android 使用socket与pc传递对象的问题
  3. Android探索之旅 | 面向对象和Java基础
  4. android okgo post传数组
  5. Android对Window对象的管理机制分析
  6. android 5.0之后利用Intent传递Serializable对象存在问题
  7. C# android base-64 字符数组的无效长度
  8. android bundle 对象 序列化

随机推荐

  1. 它山之石
  2. android 开发中遇到的问题汇总
  3. 文字自动滚动 跑马灯 轮播
  4. Android圆型头像实现
  5. Android(安卓)自动播放音频 / Android(安
  6. 【Android】关于android:divider 的用法
  7. Android:Animation Style的定义与引用系
  8. Android(安卓)SDK R11 下载地址
  9. Android7.0中文API -- AbsSpinner
  10. Android深色模式适配-想法1.0