仿猎豹清理大师波浪效果

转载自:http://blog.csdn.net/chdjj/article/details/38142953

先来看效果:


实现方式----->自定义控件
核心代码:

  1. package com.example.wavedemo1;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Path;  
  7. import android.os.Handler;  
  8. import android.util.AttributeSet;  
  9. import android.view.View;  
  10. /** 
  11.  * @author Rowandjj 
  12.  * 
  13.  *仿猎豹清理大师波浪效果 
  14.  */  
  15. public class WaterWaveView extends View  
  16. {  
  17.     private Handler mHandler;  
  18.     private long c = 0L;  
  19.     private boolean mStarted = false;  
  20.     private final float f = 0.033F;  
  21.     private int mAlpha = 70;//透明度  
  22.     private int mColor = Color.BLUE;  
  23.     private float mAmplitude = 6.0F; // 振幅  
  24.     private final Paint mPaint = new Paint();  
  25.     private float mWateLevel = 0.5F;//水高(0~1)  
  26.     private Path mPath;  
  27.     public WaterWaveView(Context paramContext)  
  28.     {  
  29.         super(paramContext);  
  30.         init(paramContext);  
  31.     }  
  32.     public WaterWaveView(Context paramContext, AttributeSet paramAttributeSet)  
  33.     {  
  34.         super(paramContext, paramAttributeSet);  
  35.         init(paramContext);  
  36.     }  
  37.     /** 
  38.      * 开始波动 
  39.      */  
  40.     public void startWave()  
  41.     {  
  42.         if (!mStarted)  
  43.         {  
  44.             this.c = 0L;  
  45.             mStarted = true;  
  46.             this.mHandler.sendEmptyMessage(0);  
  47.         }  
  48.     }  
  49.     private void init(Context context)  
  50.     {  
  51.         mPaint.setStrokeWidth(1.0F);  
  52.         mPaint.setColor(mColor);  
  53.         mPaint.setAlpha(mAlpha);  
  54.         mPath = new Path();  
  55.         mHandler = new Handler()  
  56.         {  
  57.             @Override  
  58.             public void handleMessage(android.os.Message msg)  
  59.             {  
  60.                 if (msg.what == 0)  
  61.                 {  
  62.                     invalidate();  
  63.                     if (mStarted)  
  64.                     {  
  65.                         //不断发消息给自己,使自己不断被重绘  
  66.                         mHandler.sendEmptyMessageDelayed(0, 60L);  
  67.                     }  
  68.                 }  
  69.             }  
  70.         };  
  71.     }  
  72.     @Override  
  73.     protected void onDraw(Canvas canvas)  
  74.     {  
  75.         canvas.save();  
  76.                 mPaint.setAlpha(mAlpha);  
  77.         mPaint.setColor(mColor);  
  78.         // 得到控件的宽高  
  79.         int width = getWidth();  
  80.         int height = getHeight();  
  81.         // 如果未开始(未调用startWave方法),绘制一个矩形  
  82.         if ((!mStarted) || (width == 0) || (height == 0))  
  83.         {  
  84.             canvas.drawRect(0.0F, height / 2, width, height, mPaint);  
  85.             return;  
  86.         }  
  87.         if (this.c >= 8388607L)  
  88.         {  
  89.             this.c = 0L;  
  90.         }  
  91.         //每次onDraw时c都会自增  
  92.         this.c = (1L + this.c);  
  93.         float f1 = height * (1.0F - mWateLevel);  
  94.         int top = (int) (f1 + mAmplitude);  
  95.         mPath.reset();  
  96.         // 绘制矩形,即水面静止时的高度  
  97.         canvas.drawRect(0.0F, top, width, height, mPaint);  
  98.         int startX = 0;  
  99.         //波浪效果  
  100.         while (startX < width)  
  101.         {  
  102.             int startY = (int) (f1 - mAmplitude* Math.sin(Math.PI* (2.0F * (startX + this.c * width * this.f))/ width));  
  103.             canvas.drawLine(startX, startY, startX, top, mPaint);  
  104.             startX++;  
  105.         }  
  106.         canvas.restore();  
  107.     }  
  108.     /** 
  109.      * 设置振幅 
  110.      * @param amplitued 
  111.      */  
  112.     public void setAmplitude(float amplitued)  
  113.     {  
  114.         mAmplitude = amplitued;  
  115.     }  
  116.     /** 
  117.      * 设置透明度 
  118.      * @param alpha 
  119.      */  
  120.     public void setWaterAlpha(float alpha)  
  121.     {  
  122.         this.mAlpha = ((int) (255.0F * alpha));  
  123.         mPaint.setAlpha(this.mAlpha);  
  124.     }  
  125.     /** 
  126.      * 设置颜色 
  127.      * @param color 
  128.      */  
  129.     public void setColor(int color)  
  130.     {  
  131.         this.mColor = color;  
  132.     }  
  133.       
  134.     /** 
  135.      * 设置水面高度 
  136.      * @param paramFloat 
  137.      */  
  138.     public void setWaterLevel(float paramFloat)  
  139.     {  
  140.         mWateLevel = paramFloat;  
  141.     }  
  142.       
  143.     @Override  
  144.     protected void onAttachedToWindow()  
  145.     {  
  146.         super.onAttachedToWindow();  
  147.         // 关闭硬件加速,防止异常unsupported operation exception  
  148.         this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
  149.     }  
  150. }  


 
 向普通控件一样,在布局文件中配置: 
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <com.example.wavedemo1.WaterWaveView  
  2.        android:id="@+id/wav"  
  3.        android:layout_width="match_parent"  
  4.        android:layout_height="match_parent"  
  5.        />  

然后在代码中通过调用startWave方法使水面开始波动,同时可以调用set方法控制其属性。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值