文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android拖拽助手ViewDragHelper的创建与使用实例

2024-04-02 19:55

关注

前言

在项目中,我们经常自定义ViewGroup,有时候需要拖拽它的子View,让其运动,一般情况下如果我们手动处理各种滑动事件,非常麻烦,谷歌给我们提供了一个辅助类ViewDragHelper,ViewDragHelper给我们提供了很多拖拽相关的方法以及状态跟踪。

创建实例

ViewDragHelper.create(vp, callback);

ViewDragHelper的创建比较简单,它的构造函数是私有的,只能通过create()方法创建,第一个参数是一个ViewGroup,也就是需要使用ViewDragHelper的自定义View,第二个参数callback,提供了很多拖拽相关的回调。

ViewDragHelper.Callback

下面是几个常用的方法

private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
   public boolean tryCaptureView(View child, int pointerId)
   public int getViewHorizontalDragRange(View child)
   public int clampViewPositionHorizontal(View child, int left, int dx)
   public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) 
   public void onViewReleased(View releasedChild, float xvel, float yvel) 

使用

自定义一个简单的侧拉菜单,该菜单有两个子View,一个主界面,一个侧边菜单界面

首先自定义一个ViewGroup并初始化ViewDragHelper

public class SlideMenu extends FrameLayout{
    private void init(){
       viewDragHelper = ViewDragHelper.create(this, callback);
    }
}

然后重写onInterceptTouchEvent和onTouchEvent,将这两个方法的处理逻辑交给ViewDragHelper

public boolean onInterceptTouchEvent(MotionEvent ev) {
   return viewDragHelper.shouldInterceptTouchEvent(ev);
}
public boolean onTouchEvent(MotionEvent event) {
   viewDragHelper.processTouchEvent(event);
   return true;
}

实现ViewDragHelper.Callback,重写tryCaptureView,在当前Layout中两个子VIew都需要滑动,所以直接返回true.

public boolean tryCaptureView(View child, int pointerId) {
   return true;
}

先限制一下横向滑动范围,给一个最大值

public int getViewHorizontalDragRange(View child) {
   return (int) dragRange;
}

主界面在滑动过程中,我们需要控制下它在水平方向的移动距离

public int clampViewPositionHorizontal(View child, int left, int dx) {
   if(child==mainView){
      if(left<0)left=0;//限制mainView的左边
      if(left>dragRange)left=(int) dragRange;//限制mainView的右边
   }
   return left;
}

在滑动过程中,根据拖拽回调重新对侧拉菜单和主界面布局,不断刷新他们的位置信息,这里简单起见,让侧拉菜单固定,只是主界面滑动。

public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
   if(changedView==menuView){
      menuView.layout(0, 0, menuView.getMeasuredWidth(),menuView.getMeasuredHeight());
      int newLeft = mainView.getLeft()+dx;
      if(newLeft<0)newLeft=0;
      if(newLeft>dragRange)newLeft=(int) dragRange;mainView.layout(newLeft,mainView.getTop()+dy,newLeft+mainView.getMeasuredWidth(),mainView.getBottom()+dy);
   }
}

当手指抬起释放view的时候,可能我们只是拖拽了一点,这时候我们需要根据当前拖拽的信息决定是打开菜单还是关闭菜单。

public void onViewReleased(View releasedChild, float xvel, float yvel) {
   if(mainView.getLeft()<dragRange/2){
      //在左半边
      close();
   }else {
      //在右半边
      open();
   }
}

对于view的滑动ViewDragHelper也提供了smoothSlideViewTo方法,所以close和open方法就很简单

public void close() {
   viewDragHelper.smoothSlideViewTo(mainView,0,mainView.getTop());
   ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
}
public void computeScroll() {
   if(viewDragHelper.continueSettling(true)){
      ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
   }
}

然后还可以提供一些拖拽状态回调,比如拖拽完成,拖拽中等状态,这些比较简单,直接在onViewPositionChanged中处理就可以了。

最后看一下效果

总结

到此这篇关于Android拖拽助手ViewDragHelper的创建与使用的文章就介绍到这了,更多相关Android拖拽助手ViewDragHelper内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯