zoukankan      html  css  js  c++  java
  • android Shader类简介_渲染图像示例

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

     

    Activity01 

    Java代码  收藏代码
    1. package com.yarin.android.Examples_05_11;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.view.KeyEvent;  
    6.   
    7. public class Activity01 extends Activity {  
    8.     private GameView mGameView = null;  
    9.   
    10.     @Override  
    11.     public void onCreate(Bundle savedInstanceState) {  
    12.         super.onCreate(savedInstanceState);  
    13.   
    14.         mGameView = new GameView(this);  
    15.   
    16.         setContentView(mGameView);  
    17.     }  
    18.   
    19.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
    20.         super.onKeyUp(keyCode, event);  
    21.         return true;  
    22.     }  
    23.   
    24.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
    25.         if (mGameView == null) {  
    26.             return false;  
    27.         }  
    28.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
    29.             this.finish();  
    30.             return true;  
    31.         }  
    32.         return mGameView.onKeyDown(keyCode, event);  
    33.     }  
    34. }  



    GameView 

    Java代码  收藏代码
      1. package com.yarin.android.Examples_05_11;  
      2.   
      3. import android.content.Context;  
      4. import android.graphics.Bitmap;  
      5. import android.graphics.BitmapShader;  
      6. import android.graphics.Canvas;  
      7. import android.graphics.Color;  
      8. import android.graphics.ComposeShader;  
      9. import android.graphics.LinearGradient;  
      10. import android.graphics.Paint;  
      11. import android.graphics.PorterDuff;  
      12. import android.graphics.RadialGradient;  
      13. import android.graphics.Shader;  
      14. import android.graphics.SweepGradient;  
      15. import android.graphics.drawable.BitmapDrawable;  
      16. import android.graphics.drawable.ShapeDrawable;  
      17. import android.graphics.drawable.shapes.OvalShape;  
      18. import android.view.KeyEvent;  
      19. import android.view.MotionEvent;  
      20. import android.view.View;  
      21.   
      22. public class GameView extends View implements Runnable  
      23. {  
      24.     /* 声明Bitmap对象 */  
      25.     Bitmap  mBitQQ  = null;  
      26.     int     BitQQwidth  = 0;  
      27.     int     BitQQheight = 0;  
      28.       
      29.     Paint   mPaint = null;  
      30.            
      31.     /* Bitmap渲染 */  
      32.     Shader mBitmapShader = null;  
      33.       
      34.     /* 线性渐变渲染 */  
      35.     Shader mLinearGradient = null;  
      36.       
      37.     /* 混合渲染 */  
      38.     Shader mComposeShader = null;  
      39.          
      40.     /* 唤醒渐变渲染 */  
      41.     Shader mRadialGradient = null;  
      42.       
      43.     /* 梯度渲染 */  
      44.     Shader mSweepGradient = null;  
      45.         
      46.       
      47.     ShapeDrawable mShapeDrawableQQ = null;  
      48.         
      49.     public GameView(Context context)  
      50.     {  
      51.         super(context);  
      52.           
      53.         /* 装载资源 */  
      54.         mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();  
      55.   
      56.         /* 得到图片的宽度和高度 */  
      57.         BitQQwidth = mBitQQ.getWidth();  
      58.         BitQQheight = mBitQQ.getHeight();  
      59.           
      60.         /* 创建BitmapShader对象 */  
      61.         mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);  
      62.           
      63.         /* 创建LinearGradient并设置渐变的颜色数组 说明一下这几天参数  
      64.          * 第一个 起始的x坐标 
      65.          * 第二个 起始的y坐标 
      66.                  * 第三个 结束的x坐标 
      67.                  * 第四个 结束的y坐标 
      68.          * 第五个 颜色数组 
      69.          * 第六个 这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布 
      70.          * 第七个 渲染模式 
      71.          * */  
      72.         mLinearGradient = new LinearGradient(0,0,100,100,  
      73.                                              new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},  
      74.                                              null,Shader.TileMode.REPEAT);  
      75.         /* 这里理解为混合渲染*/  
      76.         mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);  
      77.                  
      78.         /* 构建RadialGradient对象,设置半径的属性 */  
      79.         //这里使用了BitmapShader和LinearGradient进行混合  
      80.         //当然也可以使用其他的组合  
      81.         //混合渲染的模式很多,可以根据自己需要来选择  
      82.         mRadialGradient = new RadialGradient(50,200,50,  
      83.                                              new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},  
      84.                                              null,Shader.TileMode.REPEAT);  
      85.         /* 构建SweepGradient对象 */  
      86.         mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);  
      87.   
      88.         mPaint = new Paint();  
      89.           
      90.         /* 开启线程 */  
      91.         new Thread(this).start();  
      92.     }  
      93.       
      94.     public void onDraw(Canvas canvas)  
      95.     {  
      96.         super.onDraw(canvas);  
      97.           
      98.         //将图片裁剪为椭圆形  
      99.         /* 构建ShapeDrawable对象并定义形状为椭圆 */  
      100.         mShapeDrawableQQ = new ShapeDrawable(new OvalShape());  
      101.   
      102.         /* 设置要绘制的椭圆形的东西为ShapeDrawable图片 */  
      103.         mShapeDrawableQQ.getPaint().setShader(mBitmapShader);  
      104.           
      105.         /* 设置显示区域 */  
      106.         mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);  
      107.           
      108.         /* 绘制ShapeDrawableQQ */  
      109.         mShapeDrawableQQ.draw(canvas);        
      110.           
      111.         //绘制渐变的矩形  
      112.         mPaint.setShader(mLinearGradient);  
      113.         canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);  
      114.               
      115.         //显示混合渲染效果  
      116.         mPaint.setShader(mComposeShader);  
      117.         canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);  
      118.           
      119.         //绘制环形渐变  
      120.         mPaint.setShader(mRadialGradient);  
      121.         canvas.drawCircle(50, 200, 50, mPaint);  
      122.           
      123.         //绘制梯度渐变  
      124.         mPaint.setShader(mSweepGradient);  
      125.         canvas.drawRect(150, 160, 300, 300, mPaint);  
      126.           
      127.     }  
      128.       
      129.     // 触笔事件  
      130.     public boolean onTouchEvent(MotionEvent event)  
      131.     {  
      132.         return true;  
      133.     }  
      134.   
      135.   
      136.     // 按键按下事件  
      137.     public boolean onKeyDown(int keyCode, KeyEvent event)  
      138.     {  
      139.         return true;  
      140.     }  
      141.   
      142.   
      143.     // 按键弹起事件  
      144.     public boolean onKeyUp(int keyCode, KeyEvent event)  
      145.     {  
      146.         return false;  
      147.     }  
      148.   
      149.   
      150.     public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)  
      151.     {  
      152.         return true;  
      153.     }  
      154.       
      155.       
      156.     /** 
      157.      * 线程处理 
      158.      */  
      159.     public void run()  
      160.     {  
      161.         while (!Thread.currentThread().isInterrupted())  
      162.         {  
      163.             try  
      164.             {  
      165.                 Thread.sleep(100);  
      166.             }  
      167.             catch (InterruptedException e)  
      168.             {  
      169.                 Thread.currentThread().interrupt();  
      170.             }  
      171.             //使用postInvalidate可以直接在线程中更新界面  
      172.             postInvalidate();  
      173.         }  
      174.     }  
      175. }  

    http://byandby.iteye.com/blog/831011

  • 相关阅读:
    June 26th 2017 Week 26th Monday
    June 25th 2017 Week 26th Sunday
    June 24th 2017 Week 25th Saturday
    June 23rd 2017 Week 25th Friday
    June 22nd 2017 Week 25th Thursday
    2018最佳网页设计:就是要你灵感爆棚!!!
    图片素材类Web原型制作分享-Pexels
    想要打动HR的心,UX设计师求职信究竟应该怎么写?
    【UXPA大赛企业专访】Mockplus:“设计替代开发”将成为现实
    2018年最好的医疗网站设计及配色赏析
  • 原文地址:https://www.cnblogs.com/manmanlu/p/4533750.html
Copyright © 2011-2022 走看看