Android自定义控件实现水波纹效果

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Android自定义控件实现水波纹效果脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了AndROId自定义控件实现水波纹的具体代码,供大家参考,具体内容如下

示例代码:

MainActivITy.java

 package com.example.mhy.shuibowen;   import android.support.v7.app.AppCompatActivity; import android.os.Bundle;   public class MainActivity extends AppCompatActivity {     @override   PRotected void onCreate(Bundle savedInstancestate) {     suPEr.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);   } }

activity_main.XMl

 <&#63;xML version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.COM/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   android:layout_width="match_parent"   android:layout_height="match_parent"     tools:context="com.example.mhy.shuibowen.MainActivity">     <com.example.mhy.shuibowen.MyRingWave     android:layout_width="match_parent"     android:layout_height="match_parent"     /> </RelativeLayout>

MyRingWave.java

 package com.example.mhy.shuibowen;   import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View;   import java.util.ArrayList;   /**  * 水波纹效果  * Created by mhy on 2016/6/16.  */ public class MyRingWave extends View {   /**    * 二个相临波浪中心点的最小距离    */   private static final int DIS_SOLP = 13;   protected boolean isRunning = false;     private ArrayList<Wave> wList;     public MyRingWave(Context context,AttributeSet attrs) {     super(context, attrs);     wList = new ArrayList<;myRingWave.Wave>();   }     @Override   protected void onDraw(Canvas canvas) {     for(int i=0; i<wList.size(); i++) {       Wave wave = wList.get(i);       canvas.drawCircle(wave.cx, wave.cy, wave.r, wave.p);     }   }     @Override   public boolean onTouchEvent(MotionEvent event) {     super.onTouchEvent(event);       switch(event.getAction()) {       case MotionEvent.ACTION_DOWN:       case MotionEvent.ACTION_MOVE:           int x = (int) event.getX();         int y = (int) event.getY();           addPoint(x, y);           break;       default:         break;     }     return true;   }     private Handler handler = new Handler(){     public void handleMessage(android.os.Message msg) {         //刷新数据       flushData();       //刷新页面       invalidate();       //循环动画       if (isRunning) {         handler.sendEmptyMessageDelayed(0, 50);       }       }   };     /**    * 刷新数据    */   private void flushData() {       for (int i = 0; i < wList.size(); i++) {         Wave w = wList.get(i);         //如果透明度为 0 从集合中删除       int alpha = w.p.getAlpha();       if(alpha == 0){         wList.remove(i); //删除i 以后,i的值应该再减1 否则会漏掉一个对象,不过,在此处影响不大,效果上看不出来。         continue;       }         alpha-=5;       if(alpha<5){         alpha =0;       }       //降低透明度       w.p.setAlpha(alpha);         //扩大径       w.r = w.r+3;       //设置半径厚度       w.p.setstrokeWidth(w.r/3);     }    /*   * 如果集合被清空,就停止刷新动画   */     if(wList.size() == 0){       isRunning = false;     }   }     /**    * 添加新的波浪中心点    * @param x    * @param y    */   private void addPoint(int x, int y) {       if(wList.size() == 0) {       addPoint2List(x, y);       isRunning = true;       handler.sendEmptyMessage(0);     }else{       Wave w = wList.get(wList.size()-1);         if(Math.abs(w.cx - x)>DIS_SOLP || Math.abs(w.cy-y)>DIS_SOLP){         addPoint2List(x,y);       }       };   }     /**    * 添加新的波浪    * @param x    * @param y    */   private void addPoint2List(int x, int y) {     Wave w = new Wave();     w.cx = x;     w.cy=y;     Paint pa=new Paint();     pa.setColor(colors[(int)(Math.random()*4)]);     pa.setAntiAlias(true);     pa.setStyle(Paint.Style.STROKE);       w.p = pa;       wList.add(w);   }     private int [] colors = new int[]{Color.BLUE,Color.red,Color.YELLOW,Color.GREEN};   private class Wave {     //心     int cx;     int cy;       //画笔     Paint p;     //半径     int r;   } }

MyRing.java

 package com.example.mhy.shuibowen;   import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View;   /**  * Created by mhy on 2016/6/16.  */ public class MyRing extends View {     /**    * 圆心的X坐标    */   private float cx;     /**    * 圆心的Y坐标    */   private float cy;   /**    * 圆环半径    */   private float radius = 0;   /**    * 默认画笔    */   private Paint paint;   private boolean isRuning = false;     public MyRing(Context context, AttributeSet attrs) {     super(context, attrs);     initView();   }     private void initView() {     radius = 0;     paint = new Paint();     paint.setAntiAlias(true);     paint.setStyle(Paint.Style.STROKE); // 空心圆     paint.setStrokeWidth(radius / 4); // 画笔度 半径4分之一     paint.setColor(Color.GREEN); // 画笔颜色     paint.setAlpha(255); //不透明   }     @Override   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     super.onMeasure(widthMeasureSpec, heightMeasureSpec);   }     @Override   protected void onLayout(boolean changed, int l, int t, int r, int b) {     if(changed) {       cx = getWidth() / 2;       cy = getHeight() / 2;     }   }     @Override   protected void onDraw(Canvas canvas) {     canvas.drawCircle(cx, cy, radius, paint);   }     @Override   protected void onAttachedToWindow() {     super.onAttachedToWindow();   }     @Override   protected void onDetachedFromWindow() {     super.onDetacheDFromWindow();     isRuning = false;   }     @Override   public boolean onTouchEvent(MotionEvent event) {     super.onTouchEvent(event);       if(event.getAction() == MotionEvent.ACTION_DOWN) {       cx = event.getX();       cy = event.getY();       initView();       startAnim();     }     return true;   }     private Handler handler = new Handler(){     @Override     public void handleMessage(Message msg) {         // 设置透明度       int alpha = paint.getAlpha();       if(alpha == 0) {         isRuning = false;       }         // 透明度 慢慢变透明       alpha = Math.max(0, alpha-10);         paint.setAlpha(alpha);         System.out.println(alpha);         // 设置半径       radius += 5;       paint.setStrokeWidth(radius / 3);       invalidate();         if(isRuning) {         handler.sendEmptyMessageDelayed(0, 50);       }     }   };   private void startAnim() {     isRuning = true;     handler.sendEmptyMessageDelayed(0, 50);   }   }
android教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的Android自定义控件实现水波纹效果全部内容,希望文章能够帮你解决Android自定义控件实现水波纹效果所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。