android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout
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相关推荐
- Android仿Ios下拉回弹,Android ReboundScrollView仿IOS拖拽回弹效果
初衷: 其实github上有很多这种ScrollView的项目,但是不得不说功能太多太乱了,我就只是想要一个简单效果的ScrollView,另外监听下滑动距离而已,想想还是自己写了个. 这里先说下思路 ...
- android开发之仿QQ拖拽界面效果(侧滑面板)
仿QQ拖拽界面效果(侧滑面板),我们一般继承Layout,不会直接去继承ViewGroup,而是继承FrameLayout,为什么五大布局我们偏偏只继承FrameLayout呢? 第一,FrameLa ...
- Android qq消息气泡实现效果,Android 实现仿QQ拖拽气泡效果的示例
效果图: 一.实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件中重写onTouchEvent方法,然后在DOWN.MOVE.UP事件中分别处理拖拽效 ...
- 安卓开发仿微信图片拖拽_使用Android 模仿微信朋友圈图片拖拽返回
1概述 目前的app的动画效果是越来越炫了,很多主流app的图片预览返回都有类似功能,比较常见的是ios自带相册,微信朋友圈等等.自己项目中也有类似功能,最近整理了一下这个功能的代码,做个笔记记录,有 ...
- Android开发学习之ImageView手势拖拽、缩放、旋转
在Android应用中,图片随手势的拖拽.缩放.旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽.缩放.转转的TouchView. 一.实现原理 OnTouch ...
- android 仿照ios 图片选择,GitHub - wildma/PictureSelector: Android 图片选择器(仿 IOS 图片选择控件)...
PictureSelector Android 图片选择器(仿 IOS 图片选择控件) 效果图 功能特点 支持通过拍照获取图片 支持通过相册获取图片 支持图片是否裁剪两种场景 支持仿 IOS 底部弹出 ...
- Android 自定义控件之 SwitchButton(仿 iOS 开关)
上图中的按钮是 iOS 中的自带的开关控件,Android 也有很多优秀的仿这个控件的开源库,自己也是模仿着实现了一下,下面记录一下实现过程. 1 思路 首先还是来进行分解动作,从静态样子来看,这个开 ...
- Android最简单的实现View拖拽跟随手指移动效果
今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单 ...
- android Viewpager HorizontalScrollView 实现分页栏拖拽
源码:http://files.cnblogs.com/android100/ViewPaperDemo.rar 首先我们先看一个效果: 前两个是网易的,它做的title不能拖拽,.不过点击动画效果 ...
最新文章
- 安卓高手之路之(架构设计)
- Oracle 11g 下载及安装教程
- [UE4]使用蓝图关闭对象的碰撞SetActorEnableCollision
- android studio transformclasseswithJarMergingForDebug报错
- QT——设置可执行文件图标
- 计算图片相似度的方法
- 删除html中所有的脚本,从HTML内容中删除脚本标记
- 【进阶3-5期】深度解析 new 原理及模拟实现
- 电子产品设计emc风险评估_书籍介绍:EMC设计方法与风险评估技术
- 东航期货行情接口和交易接口(20190509)
- Mysql数据库死锁实战-Jmeter连接配置数据库[Mysql]
- 简述CC2530晶振、振荡器与时钟
- 域名解析中A记录、CNAME、MX记录、NS记录的区别和联系
- Tree03-TreeAndTreeMethod
- 【循序渐进学Python】Python中的循环(二)——while循环与嵌套
- Java经典算法——百钱百鸡
- 反弹shell的十种姿势
- HashSet集合保证元素唯一性原理分析
- Vue生命周期 (图解+代码解析)
- 后台开发语言的比较 java php python asp.net ruby on rails
热门文章
- 普通人也要学python吗-普通人学Python有意义吗?
- python语言的理解-初学Python语言者必须理解的下划线
- r语言和python-r语言和python学哪个?
- python爬虫流程-Python爬虫流程
- 想学python有什么用-Python为什么这么火?学习python有什么用?
- python while循环语句-python while循环控制流语句结构与用法
- python使用教程pandas-python学习教程之Numpy和Pandas的使用
- python流程控制语句-Python流程控制语句
- python语言入门详解-python初级教程:入门详解
- Linux中gcc的编译、静态库和动态库的制作