Android实现拖动效果的两种方法

 更新时间:2018年04月26日 15:49:02   作者:u013772458  
这篇文章主要为大家详细介绍了Android实现拖动效果的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

因为最近项目的需要,需要实现一个拖动效果,看了一下网上刚好有这种拖动效果的demo,代码大概如下:

private void initListener(){
    screenWidth = getScreenWidth(this);//获取屏幕宽度
    screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//屏幕高度-状态栏
    testTv.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {

          case MotionEvent.ACTION_DOWN:
            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();
            break;

          case MotionEvent.ACTION_MOVE:
            int dx = (int) event.getRawX() - lastX;
            int dy = (int) event.getRawY() - lastY;

            int top = v.getTop() + dy;


            int left = v.getLeft() + dx;


            if (top <= 0) {
              top = 0;
            }
            if (top >= screenHeight - testTv.getHeight() ) {
              top = screenHeight - testTv.getHeight();
            }
            if (left >= screenWidth - testTv.getWidth()) {
              left = screenWidth - testTv.getWidth();
            }

            if (left <= 0) {
              left = 0;
            }


            v.layout(left, top, left+v.getWidth(), top+v.getHeight());

            v.postInvalidate();

            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();

        break;
        case MotionEvent.ACTION_UP:
        break;

        }
        return true;//这里根据项目需要选择false与true
      }
    });
  }

可是我的项目本身是有涂鸦的界面,还有很多复杂的事件,发现会有很奇怪的效果,抖动很厉害,而且时不时回到原来的位置,后来发现这个v.layout(left, top, left+v.getWidth(), top+v.getHeight());可能不适合项目的需求,所以我想了另一种解法。代码如下:

 private void initListener(){
    screenWidth = getScreenWidth(this);//获取屏幕宽度
    screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//屏幕高度-状态栏
    testTv.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {

          case MotionEvent.ACTION_DOWN:
            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();
            break;

          case MotionEvent.ACTION_MOVE:
            int dx = (int) event.getRawX() - lastX;
            int dy = (int) event.getRawY() - lastY;

            int top = v.getTop() + dy;


            int left = v.getLeft() + dx;


            if (top <= 0) {
              top = 0;
            }
            if (top >= screenHeight - testTv.getHeight() ) {
              top = screenHeight - testTv.getHeight();
            }
            if (left >= screenWidth - testTv.getWidth()) {
              left = screenWidth - testTv.getWidth();
            }

            if (left <= 0) {
              left = 0;
            }

            RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(v.getWidth(), v.getHeight());
            param.leftMargin = left;
            param.topMargin = top;
            v.setLayoutParams(param);
//            v.layout(left, top, left+v.getWidth(), top+v.getHeight());

            v.postInvalidate();

            lastX = (int) event.getRawX();
            lastY = (int) event.getRawY();

        break;
        case MotionEvent.ACTION_UP:
        break;

        }
        return true;
      }
    });
  }

效果如下图:

觉得可以了,不过要注意一些事项:键盘弹出需要自己处理一下(比如处理成弹出键盘就不能移动这些,不然会变形的),我觉得这种写法可以应用于各种复杂的场景。好了,今天一些项目问题总结就到这里了,希望对大家有帮助,代码也上传了,地址如下:Android实现拖动效果

以上所述是小编给大家介绍Android实现拖动效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android查看文件夹大小以及删除文件夹的工具类

    Android查看文件夹大小以及删除文件夹的工具类

    这篇文章主要介绍了Android查看文件夹大小以及删除文件夹的工具类,Android计算文件夹大小和删除目录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android动画之渐变动画(Tween Animation)详解 (渐变、缩放、位移、旋转)

    Android动画之渐变动画(Tween Animation)详解 (渐变、缩放、位移、旋转)

    这篇文章主要介绍了Android动画之渐变动画(Tween Animation)用法,结合实例形式详细分析了Android渐变动画Tween Animation实现渐变,缩放,位移,旋转等技巧,需要的朋友可以参考下
    2016-01-01
  • Android属性动画特点详解

    Android属性动画特点详解

    这篇文章主要为大家详细介绍了Android属性动画特点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • IOS开发向右滑动返回前一个页面功能(demo)

    IOS开发向右滑动返回前一个页面功能(demo)

    本文给大家介绍使用android实现向右滑动返回一个页面的功能,大家都知道在ios7中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键,下面小编就给带来了实现代码,有需要的朋友可以参考下
    2016-06-06
  • Android 加载assets中的资源文件实例代码

    Android 加载assets中的资源文件实例代码

    这篇文章主要介绍了Android 加载assets中的资源文件实例代码的相关资料,这里附有实例代码,需要的朋友可以参考下
    2017-01-01
  • 浅谈Glide缓存key的问题

    浅谈Glide缓存key的问题

    这篇文章主要介绍了浅谈Glide缓存key的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android APP瘦身shrinkResources使用问题详解

    Android APP瘦身shrinkResources使用问题详解

    这篇文章主要为大家介绍了Android APP瘦身shrinkResources使用问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能

    Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能

    这篇文章主要介绍了Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能,需要的朋友可以参考下
    2017-12-12
  • 你该知道的Gradle配置知识总结

    你该知道的Gradle配置知识总结

    这篇文章主要给大家介绍了关于Gradle配置的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友可以参考学习,下面随着小编来一起学习学习吧。
    2017-10-10
  • android实现计步功能初探

    android实现计步功能初探

    这篇文章主要介绍了android实现计步功能初探,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论