iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android ReboundScrollView仿IOS拖拽回弹效果
  • 929
分享到

Android ReboundScrollView仿IOS拖拽回弹效果

IOSAndroid 2022-06-06 06:06:49 929人浏览 独家记忆
摘要

初衷: 其实GitHub上有很多这种ScrollView的项目,但是不得不说功能太多太乱了,我就只是想要一个简单效果的ScrollView,另外监听下滑动距离而已,想想还是

初衷:

其实GitHub上有很多这种ScrollView的项目,但是不得不说功能太多太乱了,我就只是想要一个简单效果的ScrollView,另外监听下滑动距离而已,想想还是自己写了个。

这里先说下思路吧,如果不愿意看的朋友可以直接跳过这一步,看下面的代码:

Android 原生的ScrollView是不支持拉出屏幕外,并且也没有回弹效果的,用户友好度却不不太好,不知道为什么不那么设计。
我想做的事情正如上面所述:

1.希望能拉出屏幕外
2.松手后希望控件回弹

我的思路是对ScrollView的子View进行操作

所有View的滑动控制肯定都受着onTouchEvent控制,所以,理所应当的,我要关注的重点,也就是onTouchEvent这个方法。

回弹的效果,就牵涉到位置的计算,这里我的想法就用简单的TranslateAnimation来实现。

大体思路就是这样了,先把思路确定了,然后代码总是磨出来的。

贴代码:


import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
public class ReboundScrollView extends ScrollView {
  private static final float MOVE_DELAY = 0.3f;//当拉出屏幕时的拖拽系数
  private static final int ANIM_TIME = 300;//回弹耗时
  private static final int FLING = 2;//fling 系数
  private View childView;
  private boolean havaMoved;
  private Rect originalRect = new Rect();
  private float startY;
  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();
    if (getChildCount() > 0) {
      childView = getChildAt(0);
    }
  }
  @Override
  public void fling(int velocityY) {
    super.fling(velocityY / 2);
  }
  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    if (childView == null)
      return;
    originalRect.set(childView.getLeft(), childView.getTop(),
        childView.getRight(), childView.getBottom());
  }
  public ReboundScrollView(Context context, AttributeSet attrs,
               int defStyle) {
    super(context, attrs, defStyle);
  }
  public ReboundScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public ReboundScrollView(Context context) {
    super(context);
  }
  
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    if (childView == null) {
      return super.dispatchTouchEvent(ev);
    }
    int action = ev.getAction();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        startY = ev.getY();
        break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_CANCEL:
        if (!havaMoved)
          break;
        TranslateAnimation anim = new TranslateAnimation(0, 0,
            childView.getTop(), originalRect.top);
        anim.setDuration(ANIM_TIME);
        childView.startAnimation(anim);
        // 将标志位设回false
        havaMoved = false;
        resetViewLayout();
        break;
      case MotionEvent.ACTION_MOVE:
        float nowY = ev.getY();
        int deltaY = (int) (nowY - startY);
        int offset = (int) (deltaY * MOVE_DELAY);
        childView.layout(originalRect.left, originalRect.top + offset,
            originalRect.right, originalRect.bottom + offset);
        havaMoved = true;
        break;
      default:
        break;
    }
    return super.dispatchTouchEvent(ev);
  }
  public void resetViewLayout() {
    childView.layout(originalRect.left, originalRect.top,
        originalRect.right, originalRect.bottom);
  }
}

把代码贴出来后,再来分析具体的实现:
首先是拉出屏幕,在MOVE的过程中,对于超出部分代码,我使用layout重置子View的位置。

第二个要实现的就是回弹了,拖出去总是要回来的:
这里我定义了一个Rect,在onLayout(boolean changed, int l, int t, int r, int b)方法中,记录下了ScrollView的初始位置,以便于重置回弹。

说了许多,看一下代码里的关键代码
MOVE的代码:


 float nowY = ev.getY();
        int deltaY = (int) (nowY - startY);
        int offset = (int) (deltaY * MOVE_DELAY);
        childView.layout(originalRect.left, originalRect.top + offset,
            originalRect.right, originalRect.bottom + offset);
        havaMoved = true;

这是MotionEvent.ACTION_MOVE的时候要做的,对chlidView的位置重新设置也就是lauout方法,这是基于originalRect的值来的,设定了相应的滑动系数,不然感觉实在是太灵敏了。

回弹的代码:


 if (!havaMoved)
          break;
        TranslateAnimation anim = new TranslateAnimation(0, 0,
            childView.getTop(), originalRect.top);
        anim.setDuration(ANIM_TIME);
        childView.startAnimation(anim);
        // 将标志位设回false
        havaMoved = false;
        resetViewLayout();
...
...
 public void resetViewLayout() {
    childView.layout(originalRect.left, originalRect.top,
        originalRect.right, originalRect.bottom);
  }

当手指 MotionEvent.ACTION_UP或者MotionEvent.ACTION_CANCEL的时候把clildView置于原位,然后设置动画,这就是回弹了。

补充:

这是个非常简单的回弹ScrollView,需要注意的是,我这里没有对在屏幕内正常移动和屏幕外移动作区分,那样就需要判断当前的移动是否需要我们重写了,也就是是否处于上拉,下拉的部分。没有做判断,我现在的代码就会导致你手势移动的距离和控件滚动的距离是不一样的。我是感觉如果你正常使用是不会注意到这一点的。但是不排除有这种需求。

下拉其实不太好判断,因为我这里操作的是ChildView,ScrollView在上拉过程中getScrollY()肯定是0,所以这一点,我也还没想好。不过上拉倒是比较简单。当childView.height <= ScrollView.height + getScrollY的时候就是上拉出屏幕的点了,这个应该能想通吧。

git地址:https://github.com/cjhandroid/ReboundScrollView

源码下载:Http://xiazai.jb51.net/201611/yuanma/androidReboundScrollView(jb51.net).rar

您可能感兴趣的文章:iOS Xib控件拖拽与页面跳转实例iOS实现百度地图拖拽后更新位置以及反编码浅谈iOS11新特性:新增拖拽交互体验IOS使用UICollectionView实现无限轮播效果iOS 解决UICollectionView 计算 Cell 大小的问题IOS 自定义UICollectionView的头视图或者尾视图UICollectionReusableViewiOS应用中UICollectionViewCell定制ButtoNIOS简单实现瀑布流UICollectionViewiOS中关于Swift UICollectionView横向分页的问题iOS开发UICollectionView实现拖拽效果


--结束END--

本文标题: Android ReboundScrollView仿IOS拖拽回弹效果

本文链接: https://www.lsjlt.com/news/23312.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 实现仿QQ拖拽气泡效果的示例
    目录效果图:一、实现思路二、功能实现三、全屏拖拽效果实现源码地址:效果图: 一、实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件...
    99+
    2024-04-02
  • vue实现弹窗拖拽效果
    本文实例为大家分享了vue实现弹窗拖拽效果的具体代码,供大家参考,具体内容如下 前言 实现拖拽其实简单来说就分为三步 一、创建一个js文件 因为本身dialog窗口不具备移动拖拽能力...
    99+
    2024-04-02
  • Android仿IOS系统悬浮窗效果
    在一些场合里,我们使用悬浮窗会有很大的便利,比如IOS系统的悬浮窗,360或者其他手机卫士的悬浮窗等等。 本篇博客,我们创造出两个悬浮窗,通过点击小悬浮窗打开或者关闭大悬浮窗(一个播...
    99+
    2024-04-02
  • Android RecycleView如何实现Item拖拽效果
    这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的优化需求,其中一个需求涉及到R...
    99+
    2023-06-26
  • Android 12.0仿ios的hotseat效果修改hotseat样式
    1.概述 最近在12.0产品项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要...
    99+
    2023-09-11
    android launcher hotseat样式 仿ios的hotseat样式 launcher3
  • Android实现越界回弹效果
    本文实例为大家分享了Android实现越界回弹效果的具体代码,供大家参考,具体内容如下 1、直接上图: 2、直接上代码 public class DampingReboundLay...
    99+
    2024-04-02
  • Android实现仿iOS菊花加载圈动画效果
    目录常见的实现方式效果图:完整代码布局代码 常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1、切图会增加体积,但相对简单,不过在换...
    99+
    2024-04-02
  • Android如何实现仿iOS菊花加载圈动画效果
    这篇文章主要介绍了Android如何实现仿iOS菊花加载圈动画效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见的实现方式切图,做旋转动画自定义View,绘制效果gif图...
    99+
    2023-06-15
  • Android自定义scrollview实现回弹效果
    在ios手机上经常看到页面上下滑动回弹效果,安卓中没有原生控件支持,这里自己就去自定义一个scrollview实现回弹效果 1. 新建MyScrollView并继承ScrollVie...
    99+
    2024-04-02
  • Android仿Iphone屏幕底部弹出半透明PopupWindow效果
    本文实例为大家分享了Android仿Iphone屏幕底部弹出效果的具体代码,供大家参考,具体内容如下main.xml如下: <?xml version="1.0" encoding="utf-8"?><Re...
    99+
    2023-05-30
    android iphone 底部弹出
  • Android背景图下拉回弹效果实例
    目录Android实现背景图下拉回弹效果效果实现总结Android实现背景图下拉回弹效果 增加设置不横向拉伸时增加回弹效果 增加切换横屏时可滑动效果 效果 实现 public cl...
    99+
    2024-04-02
  • Android怎么自定义scrollview实现回弹效果
    本篇内容主要讲解“Android怎么自定义scrollview实现回弹效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么自定义scrollview实现回弹效果”吧! 新建MyS...
    99+
    2023-06-29
  • iOS微信H5页面橡皮回弹效果的踩坑记录
    业务需求 近期开发的项目有一部分是与微信公众号相关的H5页面,在Android端微信上页面效果展示无异常,但是在 iOS端 微信多多少少会出现一些意想不到的bug。此次主...
    99+
    2024-04-02
  • Android 实现ViewPager边界回弹效果实例代码
    废话不多说了,直接给大家贴代码了,具体代码如下所示:public class BounceBackViewPager extends ViewPager { private int currentPosition = 0; private ...
    99+
    2023-05-31
    android viewpager 回弹
  • Android基于reclyview实现列表回弹动画效果
    reclyview实现列表回弹动画效果,供大家参考,具体内容如下 1.reclyview列表布局文件 <com.example.demo1.ReboundLayout     ...
    99+
    2024-04-02
  • Android如何实现仿网易严选底部弹出菜单效果
    这篇文章将为大家详细讲解有关Android如何实现仿网易严选底部弹出菜单效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先展示效果图如下:是不是还可以呢,由于代码量不多却注释详细,所以先贴出代码再一一...
    99+
    2023-05-30
    android
  • Android自定义View实现竖向滑动回弹效果
    本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下 前言 Android 页面滑动的时候的回弹效果 一、关键代码 public clas...
    99+
    2024-04-02
  • Android实现橡皮筋回弹和平移缩放效果
    本文实例为大家分享了Android实现橡皮筋回弹和平移缩放的具体代码,供大家参考,具体内容如下 前言 由于最近在做一个view的平移缩放功能以及橡皮筋效果,不过网上查到的大多数都是分...
    99+
    2024-04-02
  • Vue自定义指令实现弹窗拖拽四边拉伸及对角线拉伸效果
    引言        近期公司vue前端项目需求:实现弹窗的拖拽,四边拉伸及对角线拉伸,以及弹窗边界处理。本人使用vue的自定义指令编写了dra...
    99+
    2024-04-02
  • 如何在Android界面中实现一个回弹效果
    这篇文章给大家介绍如何在Android界面中实现一个回弹效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体代码如下所示:public class MyScrollView extends ScrollView { ...
    99+
    2023-05-31
    android roi %d
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作