Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout

前言

IOS 拖拽回弹给用户的体验不得不赞然后 Android 原生的 API 各种不支持, 于是乎出现的很多仿 IOS 拖拽回弹的 Android 控件 ReboundScrollView, 比起原生的 ScrollView, 体验上好了很多, 但是还是不尽人意: RebounScrollView 里的内容超出屏幕时, 你想一次性在显示完 ScrollView 里的内容紧跟着拽出屏幕, 你发现你做不到, 臣妾也做不到! 于是乎, 我想我是不是可以试试? 下面分享一个让你也可以有 IOS 拖拽回弹般体验的 ReboundFrameLayout 既然 Android 原生的 ScrollView 做不到, 那我干脆舍弃不用, 我们自己做类似 ScrollView 的滑动, 这样方便我们在滑动到顶部 (或底部) 时可以继续向下(或向上滑动)

这里链接两个大神写的拖拽回弹控件:

1ReboundScrollView 仿 IOS 拖拽回弹

2 Android 上实现仿 IOS 弹性 ScrollView

我的思路

思路图

效果展示

ReboundFramLayout

实现

利用 Scroller 方式实现滚动

代码实现比较简单, 且有详细的注释ReboundFrameLayout.java

packagejsc.kit.org.rebound;

importandroid.content.Context;

importandroid.graphics.Rect;

importandroid.util.AttributeSet;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.view.ViewConfiguration;

importandroid.widget.FrameLayout;

importandroid.widget.Scroller;

/**

* 布局上下反弹

*

* @author jsc

*/

publicclassReboundFrameLayoutextendsFrameLayout{

privatefinalStringTAG=getClass().getSimpleName();

privatefinalfloatRATIO=0.65f;

privatefinalintANIM_TIME=300;

privateViewmChildView;

privatefloatmCurY;

privatefloatmLastY;

privateScrollermScroller;

privateintmTouchSlop;

publicReboundFrameLayout(Contextcontext,AttributeSetattrs){

super(context,attrs);

mScroller=newScroller(context);

mTouchSlop=ViewConfiguration.get(context).getScaledPagingTouchSlop();

}

@Override

protectedvoidonFinishInflate(){

super.onFinishInflate();

mChildView=getChildAt(0);

}

@Override

publicbooleanonInterceptTouchEvent(MotionEventev){

switch(ev.getAction()){

caseMotionEvent.ACTION_DOWN:

mCurY=ev.getY();

mLastY=mCurY;

caseMotionEvent.ACTION_MOVE:

floatmCurY=ev.getY();

intmark=(int)(mCurY-mLastY);

intslop=Math.abs(mark);

mLastY=mCurY;

// 当滑动的距离小于 10px 的时候, 我们认为这次滑动是无效的, 销毁这次事件

if(slop>=10){

returntrue;

}

break;

caseMotionEvent.ACTION_UP:

break;

}

returnsuper.onInterceptTouchEvent(ev);

}

@Override

publicbooleanonTouchEvent(MotionEventev){

switch(ev.getAction()){

caseMotionEvent.ACTION_DOWN:

floatmCurY=ev.getY();

mLastY=mCurY;

caseMotionEvent.ACTION_MOVE:

mCurY=ev.getY();

intmYOffset=(int)((mCurY-mLastY)*RATIO);

scroll(mChildView,mYOffset);

mLastY=mCurY;

returntrue;

caseMotionEvent.ACTION_UP:

if(!mScroller.isFinished()){

mScroller.forceFinished(true);

}

mScroller.startScroll(0,getScrollY(),0,-getScrollY(),ANIM_TIME);

invalidate();

default:

break;

}

returntrue;

}

@Override

publicvoidcomputeScroll(){

if(mScroller.computeScrollOffset()){

scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

postInvalidate();

}

}

privatevoidscroll(ViewmChildView,intmYOffset){

//child 内容下滑高度

intchildScrolledY=mChildView.getScrollY();

//child 在其 parent 中的可见部分

Rectrect=newRect();

mChildView.getLocalVisibleRect(rect);

//child 实际内容高度

mChildView.measure(0,0);

intrealHeight=mChildView.getMeasuredHeight();

//child 内容滑动到其 parent 底部时需要向上滑动的距离

intdistanceFromBottom=realHeight-rect.bottom;

if(mYOffset>0){// 向下滑动

// 如果向下滑动的距离小于 child 内容上滑到其 parent 顶部的距离, 则向下滑动 child 内容 mYOffset 距离

if(mYOffset

mChildView.scrollBy(0,-mYOffset);

}else{// 如果滑动的距离大于或等于 child 内容已经下滑的高度, 则向下滑动 child 的内容至其 parent 的顶部, 再向下滑动超出部分的距离

mChildView.scrollBy(0,-childScrolledY);

scrollBy(0,-(mYOffset-childScrolledY));

}

}elseif(mYOffset<0){// 向上滑动

intdistance=Math.abs(mYOffset);

// 如果向上滑动的距离小于 child 内容下滑到其 parent 底部的距离, 则向上滑动 child 内容 distance 距离

if(distance

mChildView.scrollBy(0,distance);

}else{

mChildView.scrollBy(0,distanceFromBottom);

scrollBy(0,distance-distanceFromBottom);

}

}

}

}

关键在于方法

scroll(View mChildView, int mYOffset)

里面的处理注释很详细, 请自行参阅

最后附上源码的下载地址: https://github.com/JustinRoom/JscKit/tree/master/rebound

来源: http://www.jianshu.com/p/53d13719a6c4

android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout相关推荐

  1. Android仿Ios下拉回弹,Android ReboundScrollView仿IOS拖拽回弹效果

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

  2. android开发之仿QQ拖拽界面效果(侧滑面板)

    仿QQ拖拽界面效果(侧滑面板),我们一般继承Layout,不会直接去继承ViewGroup,而是继承FrameLayout,为什么五大布局我们偏偏只继承FrameLayout呢? 第一,FrameLa ...

  3. Android qq消息气泡实现效果,Android 实现仿QQ拖拽气泡效果的示例

    效果图: 一.实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件中重写onTouchEvent方法,然后在DOWN.MOVE.UP事件中分别处理拖拽效 ...

  4. 安卓开发仿微信图片拖拽_使用Android 模仿微信朋友圈图片拖拽返回

    1概述 目前的app的动画效果是越来越炫了,很多主流app的图片预览返回都有类似功能,比较常见的是ios自带相册,微信朋友圈等等.自己项目中也有类似功能,最近整理了一下这个功能的代码,做个笔记记录,有 ...

  5. Android开发学习之ImageView手势拖拽、缩放、旋转

    在Android应用中,图片随手势的拖拽.缩放.旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽.缩放.转转的TouchView. 一.实现原理 OnTouch ...

  6. android 仿照ios 图片选择,GitHub - wildma/PictureSelector: Android 图片选择器(仿 IOS 图片选择控件)...

    PictureSelector Android 图片选择器(仿 IOS 图片选择控件) 效果图 功能特点 支持通过拍照获取图片 支持通过相册获取图片 支持图片是否裁剪两种场景 支持仿 IOS 底部弹出 ...

  7. Android 自定义控件之 SwitchButton(仿 iOS 开关)

    上图中的按钮是 iOS 中的自带的开关控件,Android 也有很多优秀的仿这个控件的开源库,自己也是模仿着实现了一下,下面记录一下实现过程. 1 思路 首先还是来进行分解动作,从静态样子来看,这个开 ...

  8. Android最简单的实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单 ...

  9. android Viewpager HorizontalScrollView 实现分页栏拖拽

    源码:http://files.cnblogs.com/android100/ViewPaperDemo.rar 首先我们先看一个效果:  前两个是网易的,它做的title不能拖拽,.不过点击动画效果 ...

最新文章

  1. 安卓高手之路之(架构设计)
  2. Oracle 11g 下载及安装教程
  3. [UE4]使用蓝图关闭对象的碰撞SetActorEnableCollision
  4. android studio transformclasseswithJarMergingForDebug报错
  5. QT——设置可执行文件图标
  6. 计算图片相似度的方法
  7. 删除html中所有的脚本,从HTML内容中删除脚本标记
  8. 【进阶3-5期】深度解析 new 原理及模拟实现
  9. 电子产品设计emc风险评估_书籍介绍:EMC设计方法与风险评估技术
  10. 东航期货行情接口和交易接口(20190509)
  11. Mysql数据库死锁实战-Jmeter连接配置数据库[Mysql]
  12. 简述CC2530晶振、振荡器与时钟
  13. 域名解析中A记录、CNAME、MX记录、NS记录的区别和联系
  14. Tree03-TreeAndTreeMethod
  15. 【循序渐进学Python】Python中的循环(二)——while循环与嵌套
  16. Java经典算法——百钱百鸡
  17. 反弹shell的十种姿势
  18. HashSet集合保证元素唯一性原理分析
  19. Vue生命周期 (图解+代码解析)
  20. 后台开发语言的比较 java php python asp.net ruby on rails

热门文章

  1. 普通人也要学python吗-普通人学Python有意义吗?
  2. python语言的理解-初学Python语言者必须理解的下划线
  3. r语言和python-r语言和python学哪个?
  4. python爬虫流程-Python爬虫流程
  5. 想学python有什么用-Python为什么这么火?学习python有什么用?
  6. python while循环语句-python while循环控制流语句结构与用法
  7. python使用教程pandas-python学习教程之Numpy和Pandas的使用
  8. python流程控制语句-Python流程控制语句
  9. python语言入门详解-python初级教程:入门详解
  10. Linux中gcc的编译、静态库和动态库的制作