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

 

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

分类: Android Android 颜色渲染   314人阅读  评论(1)  收藏  举报

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

首先看一下效果图:

                                                     

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

MainActivity:

[java]  view plain copy
  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:

[java]  view plain copy
  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(00, mBitmapPn.getWidth(),  
  65.                 mBitmapPn.getHeight());  
  66.         // 绘制ShapeDrawable  
  67.         mShapeDrawable.draw(canvas);  
  68.         if (mRadialGradient != null) {  
  69.             mPaint.setShader(mRadialGradient);  
  70.             canvas.drawCircle(001000, 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.   
  86. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值