android的多点触摸(制作水波涟漪效果)
2013-12-14 10:02
309 查看
代码是本人自己编写的,本人还只是个菜鸟,只能说不怎么规范:
效果图:(我的手机只支持5点触控)
![](https://img-blog.csdn.net/20131214093518234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3lpX3RkY3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20131214093622203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3lpX3RkY3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
上面的坦克和“欢迎来到我的android界面!”是之前写的,坦克和字幕都是线程控制。
src包:
![](https://img-blog.csdn.net/20131214094108296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3lpX3RkY3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
思路:
通过获得手指在屏幕上的点再根据点去画圆,然后将园交给线程去扩大其半径和透明度,当半径和透明度达到一定值时园就会消失,然后从list中移除。(其中要注意的是手指和园不能跟错对象,不能画错地方)
首先必须建立point点类和Cricle类
public class Point {
float pointx;
float pointy;
int pointIndex;
public Point(float pointx, float pointy, int pointIndex) {
super();
this.pointx = pointx;
this.pointy = pointy;
this.pointIndex = pointIndex;
}
}
public class Cricle {
float x;
float y;
int pointIndex;
float r=0;//初始半径
int alpha=255;//初始透明度
public Cricle(float x,float y,int pointIndex){
this.x=x;
this.y=y;
this.pointIndex=pointIndex;
}
}Myview类:(重点)
public class MyView extends View {
public List<Cricle> cs=new ArrayList<Cricle>();
public List<Point> ps=new ArrayList<Point>();
Context context;
ViewThread thread=new ViewThread();
ViewThread2 thread2=new ViewThread2();
ViewThread3 thread3=new ViewThread3();
createCircle thread4=new createCircle();
float x=100;
float y=100;
float x2=80;
float y2=80;
int i=0;
public MyView(Context context) {
super(context);
this.context=context;
thread.start();
thread2.start();
thread4.start();
thread3.start();
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
super.draw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Style.STROKE);
//画坦克
if(i==0){
canvas.drawRect(x, y, x+20, y+100, paint);
canvas.drawRect(x+20, y+20, x+70, y+70, paint);
canvas.drawRect(x+40, y-30, x+50, y+25, paint);
canvas.drawRect(x+70, y, x+90, y+100, paint);
paint.setStyle(Style.FILL);
canvas.drawRect(x+25, y+25, x+65, y+65, paint);
}else{
canvas.drawRect(x, y, x+20, y+100, paint);
canvas.drawRect(x+20, y+20, x+70, y+70, paint);
canvas.drawRect(x+40, y+65, x+50, y+120, paint);
canvas.drawRect(x+70, y, x+90, y+100, paint);
paint.setStyle(Style.FILL);
canvas.drawRect(x+25, y+25, x+65, y+65, paint);
}
//画字幕
paint.setColor(Color.RED);
paint.setTextSize(20);
canvas.drawText("欢迎来到我的ANDRIOD界面!", x2, y2, paint);
//从list中拿到圆并画出来
for (int i = 0; i < cs.size(); i++) {
paint.setStyle(Style.STROKE);
paint.setAntiAlias(true);
paint.setStrokeWidth(3);
paint.setColor(Color.argb(cs.get(i).alpha, 0, 0, 255));
canvas.drawCircle(cs.get(i).x, cs.get(i).y, cs.get(i).r, paint);
}
}
//控制坦克和字幕X方向的移动
public class ViewThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
while(x2>0){
try {
Thread.sleep(50);
x2-=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(x2<200){
try {
Thread.sleep(50);
x2+=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//控制坦克和字幕Y方向的移动
public class ViewThread2 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
while(y>30){
i=0;
try {
Thread.sleep(50);
y-=5;
y2-=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(y<620){
i=1;
try {
Thread.sleep(50);
y+=5;
y2+=5;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//线程改变圆的半径和透明度和移除圆
public class ViewThread3 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
try {
thread.sleep(300);
for(int i = 0; i < cs.size(); i++){
cs.get(i).r+=3;
cs.get(i).alpha-=8;
if(cs.get(i).alpha<0){
cs.remove(cs.get(i));
}
postInvalidate();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//线程创建圆
public class createCircle extends Thread {
@SuppressWarnings("static-access")
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
try {
thread.sleep(200);
for(int i = 0; i < ps.size(); i++){
Cricle c=new Cricle(ps.get(i).pointx, ps.get(i).pointy, ps.get(i).pointIndex);
cs.add(c);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
MainActivity类:
public class MainActivity extends Activity {
MyView view;
GestureDetector gs=null;
//List<Cricle> cs=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
view=new MyView(MainActivity.this);
setContentView(view);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
/*if(event.getAction()==2){
Cricle c=new Cricle(event.getX(), event.getY());
view.cs.add(c);
}*/
int action=event.getAction();
int actionCode=(action&0x000000ff)>=5?(action&0x000000ff)-5:(action&0x000000ff);
int pointIndex=action>>8;
int pointId=event.getPointerId(pointIndex);
switch(actionCode){
case MotionEvent.ACTION_DOWN:
Point cp=new Point(event.getX(pointIndex), event.getY(pointIndex), pointIndex);
addPoint(cp);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP:
removePoint(pointId);
break;
case MotionEvent.ACTION_MOVE:
for(int i=0;i<event.getPointerCount();i++){
int id=event.getPointerId(i);
Point p=getPoint(id);
if(null!=p){
p.pointx=event.getX(i);
p.pointy=event.getY(i);
}
}
break;
}
return true;
}
public void addCircle(Cricle circle){
view.cs.add(circle);
}
public void addPoint(Point p){
view.ps.add(p);
}
public void removePoint(int id){
Iterator<Point> it= view.ps.iterator();
while(it.hasNext()){
Point p=it.next();
if(p.pointIndex==id){
it.remove();
}
}
}
public void removeCircle(int id){
Iterator<Cricle> it= view.cs.iterator();
while(it.hasNext()){
Cricle c=it.next();
if(c.pointIndex==id){
it.remove();
}
}
}
public Cricle getCircle(int id){
for(int i=0;i<view.cs.size();i++){
if(view.cs.get(i).pointIndex==id){
return view.cs.get(i);
}
}
return null;
}
public Point getPoint(int id){
for(int i=0;i<view.ps.size();i++){
if(view.ps.get(i).pointIndex==id){
return view.ps.get(i);
}
}
return null;
}
}
看完是不是觉得很简单,希望能帮助到需要帮助的人!!!
效果图:(我的手机只支持5点触控)
上面的坦克和“欢迎来到我的android界面!”是之前写的,坦克和字幕都是线程控制。
src包:
思路:
通过获得手指在屏幕上的点再根据点去画圆,然后将园交给线程去扩大其半径和透明度,当半径和透明度达到一定值时园就会消失,然后从list中移除。(其中要注意的是手指和园不能跟错对象,不能画错地方)
首先必须建立point点类和Cricle类
public class Point {
float pointx;
float pointy;
int pointIndex;
public Point(float pointx, float pointy, int pointIndex) {
super();
this.pointx = pointx;
this.pointy = pointy;
this.pointIndex = pointIndex;
}
}
public class Cricle {
float x;
float y;
int pointIndex;
float r=0;//初始半径
int alpha=255;//初始透明度
public Cricle(float x,float y,int pointIndex){
this.x=x;
this.y=y;
this.pointIndex=pointIndex;
}
}Myview类:(重点)
线程建议不要写在内部,另外写一个线程类
public class MyView extends View {
public List<Cricle> cs=new ArrayList<Cricle>();
public List<Point> ps=new ArrayList<Point>();
Context context;
ViewThread thread=new ViewThread();
ViewThread2 thread2=new ViewThread2();
ViewThread3 thread3=new ViewThread3();
createCircle thread4=new createCircle();
float x=100;
float y=100;
float x2=80;
float y2=80;
int i=0;
public MyView(Context context) {
super(context);
this.context=context;
thread.start();
thread2.start();
thread4.start();
thread3.start();
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
super.draw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Style.STROKE);
//画坦克
if(i==0){
canvas.drawRect(x, y, x+20, y+100, paint);
canvas.drawRect(x+20, y+20, x+70, y+70, paint);
canvas.drawRect(x+40, y-30, x+50, y+25, paint);
canvas.drawRect(x+70, y, x+90, y+100, paint);
paint.setStyle(Style.FILL);
canvas.drawRect(x+25, y+25, x+65, y+65, paint);
}else{
canvas.drawRect(x, y, x+20, y+100, paint);
canvas.drawRect(x+20, y+20, x+70, y+70, paint);
canvas.drawRect(x+40, y+65, x+50, y+120, paint);
canvas.drawRect(x+70, y, x+90, y+100, paint);
paint.setStyle(Style.FILL);
canvas.drawRect(x+25, y+25, x+65, y+65, paint);
}
//画字幕
paint.setColor(Color.RED);
paint.setTextSize(20);
canvas.drawText("欢迎来到我的ANDRIOD界面!", x2, y2, paint);
//从list中拿到圆并画出来
for (int i = 0; i < cs.size(); i++) {
paint.setStyle(Style.STROKE);
paint.setAntiAlias(true);
paint.setStrokeWidth(3);
paint.setColor(Color.argb(cs.get(i).alpha, 0, 0, 255));
canvas.drawCircle(cs.get(i).x, cs.get(i).y, cs.get(i).r, paint);
}
}
//控制坦克和字幕X方向的移动
public class ViewThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
while(x2>0){
try {
Thread.sleep(50);
x2-=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(x2<200){
try {
Thread.sleep(50);
x2+=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//控制坦克和字幕Y方向的移动
public class ViewThread2 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
while(y>30){
i=0;
try {
Thread.sleep(50);
y-=5;
y2-=5;
postInvalidate();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(y<620){
i=1;
try {
Thread.sleep(50);
y+=5;
y2+=5;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//线程改变圆的半径和透明度和移除圆
public class ViewThread3 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
try {
thread.sleep(300);
for(int i = 0; i < cs.size(); i++){
cs.get(i).r+=3;
cs.get(i).alpha-=8;
if(cs.get(i).alpha<0){
cs.remove(cs.get(i));
}
postInvalidate();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//线程创建圆
public class createCircle extends Thread {
@SuppressWarnings("static-access")
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
try {
thread.sleep(200);
for(int i = 0; i < ps.size(); i++){
Cricle c=new Cricle(ps.get(i).pointx, ps.get(i).pointy, ps.get(i).pointIndex);
cs.add(c);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
MainActivity类:
public class MainActivity extends Activity {
MyView view;
GestureDetector gs=null;
//List<Cricle> cs=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
view=new MyView(MainActivity.this);
setContentView(view);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
/*if(event.getAction()==2){
Cricle c=new Cricle(event.getX(), event.getY());
view.cs.add(c);
}*/
int action=event.getAction();
int actionCode=(action&0x000000ff)>=5?(action&0x000000ff)-5:(action&0x000000ff);
int pointIndex=action>>8;
int pointId=event.getPointerId(pointIndex);
switch(actionCode){
case MotionEvent.ACTION_DOWN:
Point cp=new Point(event.getX(pointIndex), event.getY(pointIndex), pointIndex);
addPoint(cp);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP:
removePoint(pointId);
break;
case MotionEvent.ACTION_MOVE:
for(int i=0;i<event.getPointerCount();i++){
int id=event.getPointerId(i);
Point p=getPoint(id);
if(null!=p){
p.pointx=event.getX(i);
p.pointy=event.getY(i);
}
}
break;
}
return true;
}
public void addCircle(Cricle circle){
view.cs.add(circle);
}
public void addPoint(Point p){
view.ps.add(p);
}
public void removePoint(int id){
Iterator<Point> it= view.ps.iterator();
while(it.hasNext()){
Point p=it.next();
if(p.pointIndex==id){
it.remove();
}
}
}
public void removeCircle(int id){
Iterator<Cricle> it= view.cs.iterator();
while(it.hasNext()){
Cricle c=it.next();
if(c.pointIndex==id){
it.remove();
}
}
}
public Cricle getCircle(int id){
for(int i=0;i<view.cs.size();i++){
if(view.cs.get(i).pointIndex==id){
return view.cs.get(i);
}
}
return null;
}
public Point getPoint(int id){
for(int i=0;i<view.ps.size();i++){
if(view.ps.get(i).pointIndex==id){
return view.ps.get(i);
}
}
return null;
}
}
看完是不是觉得很简单,希望能帮助到需要帮助的人!!!
相关文章推荐
- android 代码实现控件之间的间距
- 解決Linux下Android开发真机调试设备不被识别问题
- [Android]在代码里运行另一个程序的方法
- [软件咨询]WPS2012正式版已发布 金山Office移动版4.0发布
- Android笔记-Linux Kernel Ftrace (Function Trace)解析
- android USB如何修改VID具体实现
- Android Mouse实现过程详细笔记
- 深入Android Browser配置管理的详解
- Android Mms之:深入理解对话列表管理
- Android APP与媒体存储服务的交互
- android 多线程技术应用
- Android之采用execSQL与rawQuery方法完成数据的添删改查操作详解
- Android数据类型之间相互转换系统介绍
- 通过Android trace文件分析死锁ANR实例过程
- Android实现左右滑动效果的方法详解
- Android 各国语言缩写及简称详细介绍
- Android 自动判断是电话,网址,EMAIL方法之Linkify的使用
- android IPC之binder通信机制
- Android应用开发中模拟按下HOME键的效果(实现代码)
- Android 读写文件方法汇总