当前位置: 移动技术网 > IT编程>移动开发>Android > Android TouchListener实现拖拽删实例代码

Android TouchListener实现拖拽删实例代码

2019年07月24日  | 移动技术网IT编程  | 我要评论

鲜声任飞扬,下载区,飓风营救2迅雷下载

android touchlistener实现拖拽删实例代码

如果为一个控件设置了该触摸监听, 控件会随着用户的拖动而移动, 如果拖动的距离大过设置的临界值, 那么当松开手指时会有回调ondragcomplete, 用户可在该方法中将该控件从父布局中删除, 或这进行其他操作。 如果用户拖拽的距离小于临界值, 那么当用户松开手指时控件会回谈到原来的初始位置。这时会触发ondragrebound回调。 如果用户触摸控件之后没有拖拽而是直接松开手指, 会触发onclick回调, 这样用户就不用为该控件设置onclick监听。

源码如下:


import android.util.log; 
import android.view.motionevent; 
import android.view.view; 
import android.view.viewgroup; 
 
/** 
 * created by zhangjg on 14-10-10. 
 */ 
public class dragtouchlistener implements view.ontouchlistener { 
 
  /** 
   * drag directions 
   */ 
  public static final int direction_up = 0; 
  public static final int direction_down = 1; 
  public static final int direction_left = 2; 
  public static final int direction_right = 3; 
 
 
  private int mdragdirection = -1; 
  private int mdragdistance = -1; 
  private viewgroup.marginlayoutparams mparams; 
  private viewgroup.marginlayoutparams moriginparams; 
 
 
  private int vieworiginmargin = -1000; 
 
  private float mstarty = 0; 
  private float mstartx = 0; 
  private boolean istouched = false; 
 
  public dragtouchlistener(int dragdirection, int dragdistance){ 
    mdragdirection = dragdirection; 
    mdragdistance = dragdistance; 
  } 
 
  protected void onclick(view view){ 
 
  } 
 
  protected void ondragcomplete(view view){ 
 
  } 
 
  protected void ondragrebound(view view){ 
 
  } 
 
  @override 
  public boolean ontouch(view view, motionevent motionevent) { 
 
 
    if (vieworiginmargin == -1000){ 
      mparams = (viewgroup.marginlayoutparams)view.getlayoutparams(); 
      if (mdragdirection == direction_up) { 
        vieworiginmargin = mparams.bottommargin; 
      }else if (mdragdirection == direction_down){ 
        vieworiginmargin = mparams.topmargin; 
      }else if (mdragdirection == direction_left){ 
        vieworiginmargin = mparams.rightmargin; 
      }else if (mdragdirection == direction_right){ 
        vieworiginmargin = mparams.leftmargin; 
      } 
    } 
 
 
    int action = motionevent.getaction(); 
    switch (action){ 
      case motionevent.action_down: 
        istouched = true; 
        mstarty = motionevent.gety(); 
        mstartx = motionevent.getx(); 
        return true; 
      case motionevent.action_move: 
        float y = motionevent.gety(); 
        float x = motionevent.getx(); 
 
        if (mdragdirection == direction_up){ 
          if(y < mstarty){ 
            mparams.bottommargin = vieworiginmargin +(int) (mstarty - y); 
          } 
        }else if (mdragdirection == direction_down){ 
          if (y > mstarty){ 
            mparams.topmargin = vieworiginmargin + (int) (y - mstarty); 
          } 
        }else if (mdragdirection == direction_left){ 
          if (x < mstartx){ 
            mparams.rightmargin = vieworiginmargin + (int) (mstartx - x); 
          } 
        }else if (mdragdirection == direction_right){ 
          if (x > mstartx){ 
            mparams.leftmargin = vieworiginmargin + (int) (x - mstartx); 
          } 
        } 
 
        view.setlayoutparams(mparams); 
        break; 
      case motionevent.action_up: 
        float nowy = motionevent.gety(); 
        float nowx = motionevent.getx(); 
 
        int deltax = (int)nowx - (int)mstartx; 
        int deltay = (int)nowy - (int)mstarty; 
 
        if (istouched && math.abs(deltax) < 5 && math.abs(deltay) < 5){ 
          onclick(view); 
          break; 
        } 
 
        if (mdragdirection == direction_up){ 
          if (istouched && mstarty - nowy > mdragdistance){ 
 
//            log.i("test-drag", "direction up , starty = " + mstarty + ", nowy = " + nowy + 
//                ", starty - nowy = " + (mstarty - nowy) + ", dragdistance : " + mdragdistance); 
            ondragcomplete(view); 
 
          }else if (mstarty - nowy > 0 && mstarty - nowy < mdragdistance ){ 
            mparams.bottommargin = vieworiginmargin; 
            view.setlayoutparams(mparams); 
            ondragrebound(view); 
          } 
        }else if (mdragdirection == direction_down){ 
 
          if (istouched && nowy - mstarty > mdragdistance){ 
            ondragcomplete(view); 
          }else if ( nowy - mstarty > 0 && nowy - mstarty < mdragdistance ){ 
            mparams.topmargin = vieworiginmargin; 
            view.setlayoutparams(mparams); 
            ondragrebound(view); 
          } 
        }else if (mdragdirection == direction_left){ 
          if (istouched && mstartx - nowx > mdragdistance){ 
            ondragcomplete(view); 
          }else if ( mstartx - nowx > 0 && mstartx - nowx < mdragdistance ){ 
            mparams.rightmargin = vieworiginmargin; 
            view.setlayoutparams(mparams); 
            ondragrebound(view); 
          } 
        }else if (mdragdirection == direction_right){ 
          if (istouched && nowx - mstartx > mdragdistance){ 
            ondragcomplete(view); 
          }else if ( nowx - mstartx > 0 && nowx - mstartx < mdragdistance ){ 
            mparams.leftmargin = vieworiginmargin; 
            view.setlayoutparams(mparams); 
            ondragrebound(view); 
          } 
        } 
 
        istouched = false; 
 
        break; 
    } 
    return false; 
  } 
} 

在使用时继承该类, 并覆盖三个回调方法, 就可以在合适的时机得到回调。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网