怎么在Android中利用视图实现一个拖动功能

  介绍

这篇文章将为大家详细讲解有关怎么在Android中利用视图实现一个拖动功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Android应用界面中可以看得见的都是由一个个的观点所组成的,几乎所有的可视的控件都是基于观点写的。在视图中提供了对接触也就是手势的捕获和传递,我们可以对视图里面手势的重写来达到我们所需要的特性,比如说我们现在要做一款游戏,内容很简单,就是要实现让如图所示的一个黑色的小球在根据手指移动而在手机屏幕内移动。

我们可以重写视图里面的公共布尔>/* *   ,* Created  by  obo 提醒15/8/21。   ,*/{public  class  TouchView  extends 视图   ,   public 才能static  String  TAG =, TouchView.class.getCanonicalName ();//当才能前小球的位置   private 才能PointF  currrentPosition =, new  PointF (100100);//手才能指触摸起点坐标   private 才能PointF  moveStartPosition =, new  PointF (0,0);//当才能前手指位置坐标   private 才能PointF  moveEndPosition =, new  PointF (0,0);   ,   private 才能Context 语境;   ,   public 才能;TouchView (Context 上下文,AttributeSet  attrs), {   ,,,超级(上下文,attrs);   ,,,this.context =,上下文;   ,,}   ,   @Override才能   public 才能;void  onDraw (Canvas 帆布)   {才能   ,,,super.onDraw(画布);   ,,,canvas.drawCircle(时间+ currrentPosition.x  (moveEndPosition.x 作用;moveStartPosition.x) currrentPosition.y + (moveEndPosition.y 作用;moveStartPosition.y), 50岁,new 油漆());   ,,}   ,   @Override才能   public 才能;boolean  onTouchEvent (MotionEvent 事件),{   ,   ,,,switch  (event.getActionMasked ())   ,,,{   ,,,,,case  MotionEvent.ACTION_DOWN:   ,,,,,,,moveStartPosition.x =, event.getX ();   ,,,,,,,moveStartPosition.y =, event.getY ();   ,,,,,,,休息;   ,,,,,case  MotionEvent.ACTION_MOVE:   ,,,,,,,moveEndPosition.x =, event.getX ();   ,,,,,,,moveEndPosition.y =, event.getY ();   ,,,,,,,//刷新   ,,,,,,,this.postInvalidate ();   ,,,,,,,休息;   ,   ,,,,,case  MotionEvent.ACTION_UP:   ,,,,,,,currrentPosition.x  +=, (moveEndPosition.x 作用;moveStartPosition.x);   ,,,,,,,currrentPosition.y  +=, (moveEndPosition.y 作用;moveStartPosition.y);   ,,,,,,,moveStartPosition.x =, moveEndPosition.x;   ,,,,,,,moveStartPosition.y =, moveEndPosition.y;   ,,,,,,,休息;   ,,,,,默认值:   ,,,}   ,,,return 真实;   ,,}   }

可以看到当前onTouchEvent方法返回真正的,表明这个观点是要对当前手势操作进行捕获的,这里包括按下,移动和抬起等相关操作,如果返回的是虚假的话,只会接收到第一次的一个ACTION_DOWN也就是按下的响应,之后的移动手势和抬起的手势都无法获取到。

方法onTouchEvent里面做了三件事情:1。当用户手指按下的时候,初始化记录下开始按下的坐标,并立即返回不需要刷新界面。2。当用户移动手指的时候,记录用户手指的位置,并且重新刷新界面。3。当用户退出手势也就是抬起手指的时候,将位移赋值给基础坐标点,并让手势起点坐标和手势终点坐标x, y相等(清零)。

而如果使用矩阵的话将会使整个过程变得更加简单,只需要事先得到小球的位图就能使用矩阵对小球进行包括位移,形变,旋转在内的变换,这里只使用矩阵的位移变换效果,具体实现代码如下:

/* *   ,* Created  by  obo 提醒15/8/26。   ,*/public  class  MatrixView  extends  View  {   ,   public 才能final  static  String  TAG =, MatrixView.class.getCanonicalName ();//位图才能运行矩阵   Matrix 才能;Matrix =, new 矩阵();//才能记录点   PointF 才能;startPoint =, new  PointF ();//自才能定义位图   Bitmap 才能;Bitmap =, Bitmap.createBitmap(100100年,Bitmap.Config.ARGB_8888);   ,   public 才能;MatrixView (Context 上下文,AttributeSet  attrs), {   ,,,超级(上下文,attrs);   ,   ,,,Canvas  Canvas =, new 画布(位图);   ,,,//直接在图上面绘制一个小的球   ,,,canvas.drawCircle (50 50 50, new 油漆());   ,,}   ,   @Override才能   public 才能;void  onDraw (Canvas 帆布)   {才能   ,,,super.onDraw(画布);   ,   ,,,canvas.drawBitmap(位图,矩阵,,new 油漆());   ,,}   ,   @Override才能   public 才能;boolean  onTouchEvent (MotionEvent 事件)   {才能   ,,,super.onTouchEvent(事件);   ,   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在Android中利用视图实现一个拖动功能