水波纹

来源:互联网 发布:java图形界面的布局 编辑:程序博客网 时间:2024/04/27 15:38
1. 水波纹  --- 继承View
  
实现步骤:
1、自定义类继承View
2、重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心。
3、发送handler信息,对数据进行修改,刷新页面。
4、重写onDraw方法,绘制一个圆环。
5、如果可以执行动画,重复上面第3步。
① activity_main.xml布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    .......>    <com.itheima.ring.MyRingWave        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        /></RelativeLayout>
② MyRingWave.java
/** 水波纹效果 */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) { //在xml中添加了布局就会调用这个构造函数super(context, attrs);wList = new ArrayList<MyRingWave.Wave>();}private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {flushData();         //刷新数据invalidate();         //刷新页面if (isRunning) {     //循环动画handler.sendEmptyMessageDelayed(0, 50);}};};@Overrideprotected 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);}}@Overridepublic 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;}return true; }/** 添加新的波浪中心点 */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);}};}/** 添加新的波浪 */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(Style.STROKE);w.p = pa;wList.add(w);}private int [] colors = new int[]{Color.BLUE,Color.RED,Color.YELLOW,Color.GREEN};/** * 刷新数据 */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;}}/** * 定义一个波浪 */private class Wave {//圆心int cx;int cy;//画笔Paint p;//半径int r;}}

2、Hander详解
① 给threadLocal设置了一个looper对象,在looper的构造 方法中,创建了一个messageQueue对象
② 将message发送到messageQueue当中,在messageQueue里面,所有的message都是按时间为顺序从小到大排列
③ 顺序取出messageQueue里面的message,并执行message.target.dispatchMessage(),其中message.target就是 发送这个信息的handler.
 Handler的使用可以阅读这篇文章---- Android Handler 主线程 子线程 双向通信

消费者模式。


0 0
原创粉丝点击