Android中自定义水波纹
2016-07-11 20:48
393 查看
package com.example.waterview; import java.util.ArrayList; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class MyView extends View{ private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW, Color.GREEN, Color.BLACK, Color.DKGRAY }; // /控制是否继续执行动画 protected boolean isRunning = false; /** * 装圆的集合 */ private ArrayList<Wave> wList; public MyView(Context context, AttributeSet attrs) { super(context, attrs); wList = new ArrayList<MyView.Wave>(); } Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: System.out.println(wList.size() + "-----------"); // 刷新数据 flushData(); // 刷新页面 invalidate(); if (isRunning) { handler.sendEmptyMessageDelayed(1, 50); } break; default: break; } }; }; @SuppressLint({ "ClickableViewAccessibility", "NewApi" }) @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: int x = (int) event.getX(); int y = (int) event.getY(); setCircle(x, y); System.out.println(x + "====" + y); break; } return true; } /** * 更新圆的大小和透明度 */ protected void flushData() { for (int i = 0; i < wList.size(); i++) { Wave wave = wList.get(i); // 获得画笔透明度 int alpha = wave.p.getAlpha(); // 透明的越来越高 alpha = alpha - 5; if (alpha < 5) { alpha = 0; wList.remove(i); // isRunning=false; } // 设置的透明度越来越高 wave.p.setAlpha(alpha); // 扩大半径 wave.r = wave.r + 3; wave.p.setStrokeWidth(wave.r / 3); } if (wList.size() == 0) { isRunning = false; } } /** * 设置圆 * * @param x * @param y */ private void setCircle(int x, int y) { if (wList.size() == 0) { createAndAddCircle(x, y); isRunning = true; handler.sendEmptyMessage(1); } else { createAndAddCircle(x, y); } } @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); } } /** * 创造圆并且添加 */ private void createAndAddCircle(int x, int y) { Wave wave = new Wave(); wave.cx = x; wave.cy = y; Paint paint = new Paint(); paint.setStyle(Style.STROKE); paint.setAntiAlias(true); paint.setColor(colors[(int) (Math.random() * 6)]); wave.p = paint; wList.add(wave); } // 圆的封装类 private class Wave { // 圆心 int cx; int cy; // 画笔 Paint p; // 半径 int r; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories