Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果

首先看一下效果图:

                                                    

轻触屏幕,即可看到对应的效果,可以看到,实现这种效果,利用RadialGradient ,只需简单几行代码:

MainActivity:

  1. package com.tony.testshader;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.view.Menu;  
  8. import android.widget.SeekBar;  
  9. import android.widget.SeekBar.OnSeekBarChangeListener;  
  10.   
  11. public class MainActivity extends Activity  implements OnSeekBarChangeListener{  
  12.   
  13.      private WaterRipplesView waterRipplesView;  
  14.        
  15.        
  16.       
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.   
  21.           
  22.         waterRipplesView = new WaterRipplesView(this);  
  23.         setContentView(waterRipplesView);  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onCreateOptionsMenu(Menu menu) {  
  28.         getMenuInflater().inflate(R.menu.main, menu);  
  29.         return true;  
  30.     }  
  31.   
  32.     
  33.   
  34. }  


WaterRipplesView:

    1. package com.tony.testshader;  
    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.Paint;  
    9. import android.graphics.RadialGradient;  
    10. import android.graphics.Shader;  
    11. import android.graphics.drawable.BitmapDrawable;  
    12. import android.graphics.drawable.ShapeDrawable;  
    13. import android.graphics.drawable.shapes.OvalShape;  
    14. import android.util.AttributeSet;  
    15. import android.util.DisplayMetrics;  
    16. import android.view.MotionEvent;  
    17. import android.view.View;  
    18. /** 
    19.  * 水波纹效果 
    20.  * @author tony 
    21.  * 
    22.  */  
    23.   
    24.  public class WaterRipplesView extends View {  
    25.   
    26.     Shader mBitmapShader = null;  
    27.     Bitmap mBitmapPn = null;  
    28.     Paint mPaint = null;  
    29.     Shader mRadialGradient = null;  
    30.     Canvas mCanvas = null;  
    31.     ShapeDrawable mShapeDrawable = null;  
    32.   
    33.     public WaterRipplesView(Context context) {  
    34.         super(context);  
    35.   
    36.         // 初始化工作  
    37.         Bitmap bitmapTemp = ((BitmapDrawable) getResources().getDrawable(  
    38.                 R.drawable.leaf)).getBitmap();  
    39.         DisplayMetrics dm = getResources().getDisplayMetrics();  
    40.         // 创建与当前使用的设备窗口大小一致的图片  
    41.         mBitmapPn = Bitmap.createScaledBitmap(bitmapTemp, dm.widthPixels,  
    42.                 dm.heightPixels, true);  
    43.         // 创建BitmapShader object  
    44.         mBitmapShader = new BitmapShader(mBitmapPn, Shader.TileMode.REPEAT,  
    45.                 Shader.TileMode.MIRROR);  
    46.         mPaint = new Paint();  
    47.     }  
    48.   
    49.     public WaterRipplesView(Context context, AttributeSet attrs) {  
    50.         super(context, attrs);  
    51.     }  
    52.   
    53.     @Override  
    54.     protected void onDraw(Canvas canvas) {  
    55.         // TODO Auto-generated method stub  
    56.         super.onDraw(canvas);  
    57.   
    58.         // 将图片裁剪为椭圆型  
    59.         // 创建ShapeDrawable object,并定义形状为椭圆  
    60.         mShapeDrawable = new ShapeDrawable(new OvalShape());// OvalShape:椭圆  
    61.         // 设置要绘制的椭圆形的东西为ShapeDrawable图片  
    62.         mShapeDrawable.getPaint().setShader(mBitmapShader);  
    63.         // 设置显示区域  
    64.         mShapeDrawable.setBounds(0, 0, mBitmapPn.getWidth(),  
    65.                 mBitmapPn.getHeight());  
    66.         // 绘制ShapeDrawable  
    67.         mShapeDrawable.draw(canvas);  
    68.         if (mRadialGradient != null) {  
    69.             mPaint.setShader(mRadialGradient);  
    70.             canvas.drawCircle(0, 0, 1000, mPaint);  
    71.         }  
    72.   
    73.     }  
    74.   
    75.     // @覆写触摸屏事件  
    76.     public boolean onTouchEvent(MotionEvent event) {  
    77.         // @设置alpha通道(透明度)  
    78.         mPaint.setAlpha(400);  
    79.         mRadialGradient = new RadialGradient(event.getX(), event.getY(), 48,  
    80.                 new int[] { Color.WHITE, Color.TRANSPARENT },null, Shader.TileMode.REPEAT);  
    81.         // @重绘  
    82.         postInvalidate();  
    83.         return true;  
    84.     }  
    85.   
原文地址:https://www.cnblogs.com/Free-Thinker/p/5571859.html