• 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

  • 相关阅读:
    【leetcode】1442. Count Triplets That Can Form Two Arrays of Equal XOR
    【leetcode】1441. Build an Array With Stack Operations
    【leetcode】1437. Check If All 1's Are at Least Length K Places Away
    cxCheckCombobox
    修改现有字段默认值
    2018.01.02 exprottoexcel
    Statusbar OwnerDraw
    dxComponentPrinter记录
    单据暂存操作思路整理
    设置模式9(装饰者,责任链,桥接,访问者)
  • 原文地址:https://www.cnblogs.com/manmanlu/p/4533750.html
Copyright © 2020-2023  润新知