• 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.   
  • 相关阅读:
    201116西瓜书机器学习系列---2、模型评估
    201116西瓜书机器学习系列---1、绪论
    js中null和undefined的区别
    ajax和pjax有什么区别
    html5中的web存储
    Java调用linux命令及Shell脚本
    plsql developer中,清除登录历史
    PLSQL自动登录,记住用户名密码&日常使用技巧
    Linux中查看进程状态信息
    Is there any difference between GROUP BY and DISTINCT
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5571859.html
Copyright © 2020-2023  润新知