Android仿IOS上拉下拉弹性效果

Android仿IOS阻尼效果,上下弹性滑动,改变背景颜色 之前在做项目的时候碰到过一个问题,废话不多说,先看我自己录制的一个效果 刚开始是想着百度搜索去看有没有合适的工具类,果不其然,搜到了很多,这里我贴上两个博客地址,大家可以先去看他们的再来看我的 https://blog.youkuaiyun.com/jky_yihuangxing/article/details/51981888 https://blog.youkuaiyun.com/zhangjg_blog/... 阅读详情


本文转自:http://blog.youkuaiyun.com/u014733374/article/details/42739345


用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好;Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果。先看效果,感觉有些时候还是蛮实用的。

    思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了。
    代码:
    自定义View,继承自Scrollview。MyReboundScrollView类
[java]  view plain  copy
  1. package com.wj.myreboundscrollview.customview;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Rect;  
  5. import android.util.AttributeSet;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.animation.TranslateAnimation;  
  9. import android.widget.ScrollView;  
  10.   
  11. //仿ios可上提下拉的ScrollView  
  12. public class MyReboundScrollView extends ScrollView {  
  13.       
  14.     private static final String TAG = "ElasticScrollView";  
  15.       
  16.     //移动因子, 是一个百分比, 比如手指移动了100px, 那么View就只移动50px  
  17.     //目的是达到一个延迟的效果  
  18.     private static final float MOVE_FACTOR = 0.5f;  
  19.        
  20.     //松开手指后, 界面回到正常位置需要的动画时间  
  21.     private static final int ANIM_TIME = 100;  
  22.        
  23.     //ScrollView的子View, 也是ScrollView的唯一一个子View  
  24.     private View contentView;   
  25.        
  26.     //手指按下时的Y值, 用于在移动时计算移动距离  
  27.     //如果按下时不能上拉和下拉, 会在手指移动时更新为当前手指的Y值  
  28.     private float startY;  
  29.        
  30.     //用于记录正常的布局位置  
  31.     private Rect originalRect = new Rect();  
  32.        
  33.     //手指按下时记录是否可以继续下拉  
  34.     private boolean canPullDown = false;  
  35.        
  36.     //手指按下时记录是否可以继续上拉  
  37.     private boolean canPullUp = false;  
  38.        
  39.     //在手指滑动的过程中记录是否移动了布局  
  40.     private boolean isMoved = false;  
  41.    
  42.     public MyReboundScrollView(Context context) {  
  43.         super(context);  
  44.     }  
  45.        
  46.     public MyReboundScrollView(Context context, AttributeSet attrs) {  
  47.         super(context, attrs);  
  48.     }  
  49.    
  50.     @Override  
  51.     protected void onFinishInflate() {  
  52.         if (getChildCount() > 0) {  
  53.             contentView = getChildAt(0);  
  54.         }  
  55.     }  
  56.        
  57.     @Override  
  58.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  59.         super.onLayout(changed, l, t, r, b);  
  60.            
  61.         if(contentView == null) return;  
  62.    
  63.         //ScrollView中的唯一子控件的位置信息, 这个位置信息在整个控件的生命周期中保持不变  
  64.         originalRect.set(contentView.getLeft(), contentView.getTop(), contentView  
  65.                 .getRight(), contentView.getBottom());  
  66.     }  
  67.    
  68.     //在触摸事件中, 处理上拉和下拉的逻辑  
  69.     @Override  
  70.     public boolean dispatchTouchEvent(MotionEvent ev) {  
  71.            
  72.         if (contentView == null) {  
  73.             return super.dispatchTouchEvent(ev);  
  74.         }  
  75.    
  76.         int action = ev.getAction();  
  77.            
  78.         switch (action) {  
  79.         case MotionEvent.ACTION_DOWN:  
  80.                
  81.             //判断是否可以上拉和下拉  
  82.             canPullDown = isCanPullDown();  
  83.             canPullUp = isCanPullUp();  
  84.                
  85.             //记录按下时的Y值  
  86.             startY = ev.getY();  
  87.             break;  
  88.                
  89.         case MotionEvent.ACTION_UP:  
  90.                
  91.             if(!isMoved) break;  //如果没有移动布局, 则跳过执行  
  92.                
  93.             // 开启动画  
  94.             TranslateAnimation anim = new TranslateAnimation(0, 0, contentView.getTop(),  
  95.                     originalRect.top);  
  96.             anim.setDuration(ANIM_TIME);  
  97.                
  98.             contentView.startAnimation(anim);  
  99.                
  100.             // 设置回到正常的布局位置  
  101.             contentView.layout(originalRect.left, originalRect.top,   
  102.                     originalRect.right, originalRect.bottom);  
  103.                
  104.             //将标志位设回false  
  105.             canPullDown = false;  
  106.             canPullUp = false;  
  107.             isMoved = false;  
  108.                
  109.             break;  
  110.         case MotionEvent.ACTION_MOVE:  
  111.                
  112.             //在移动的过程中, 既没有滚动到可以上拉的程度, 也没有滚动到可以下拉的程度  
  113.             if(!canPullDown && !canPullUp) {  
  114.                 startY = ev.getY();  
  115.                 canPullDown = isCanPullDown();  
  116.                 canPullUp = isCanPullUp();  
  117.                    
  118.                 break;  
  119.             }  
  120.                
  121.             //计算手指移动的距离  
  122.             float nowY = ev.getY();  
  123.             int deltaY = (int) (nowY - startY);  
  124.                
  125.             //是否应该移动布局  
  126.             boolean shouldMove =   
  127.                     (canPullDown && deltaY > 0)    //可以下拉, 并且手指向下移动  
  128.                     || (canPullUp && deltaY< 0)    //可以上拉, 并且手指向上移动  
  129.                     || (canPullUp && canPullDown); //既可以上拉也可以下拉(这种情况出现在ScrollView包裹的控件比ScrollView还小)  
  130.                
  131.             if(shouldMove){  
  132.                 //计算偏移量  
  133.                 int offset = (int)(deltaY * MOVE_FACTOR);  
  134.                    
  135.                 //随着手指的移动而移动布局  
  136.                 contentView.layout(originalRect.left, originalRect.top + offset,  
  137.                         originalRect.right, originalRect.bottom + offset);  
  138.                    
  139.                 isMoved = true;  //记录移动了布局  
  140.             }  
  141.                
  142.             break;  
  143.         default:  
  144.             break;  
  145.         }  
  146.    
  147.         return super.dispatchTouchEvent(ev);  
  148.     }  
  149.        
  150.    
  151.     //判断是否滚动到顶部  
  152.     private boolean isCanPullDown() {  
  153.         return getScrollY() == 0 ||   
  154.                 contentView.getHeight() < getHeight() + getScrollY();  
  155.     }  
  156.        
  157.     //判断是否滚动到底部  
  158.     private boolean isCanPullUp() {  
  159.         return  contentView.getHeight() <= getHeight() + getScrollY();  
  160.     }  
  161. }  
    代码注释非常清楚。
    布局文件直接使用
[html]  view plain  copy
  1. <com.wj.myreboundscrollview.customview.MyReboundScrollView  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".MainActivity"  
  7.     android:orientation="vertical">  
  8.   
  9.     <LinearLayout  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:orientation="vertical">  
  13.         <EditText  
  14.             android:id="@+id/et_name"  
  15.             android:layout_width="match_parent"  
  16.             android:layout_height="wrap_content"  
  17.             android:layout_marginTop="12dip"  
  18.             android:hint="Your Name"/>  
  19.   
  20.         <EditText  
  21.             android:id="@+id/et_feedback"  
  22.             android:layout_width="match_parent"  
  23.             android:layout_height="wrap_content"  
  24.             android:layout_marginTop="32dip"  
  25.             android:hint="Your Feedback"  
  26.             android:lines="5"/>  
  27.   
  28.         <Button  
  29.             android:id="@+id/btn_submit"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:layout_gravity="center"  
  33.             android:layout_marginTop="42dip"  
  34.             android:text="Submit"  
  35.             android:onClick="submit"/>  
  36.     </LinearLayout>  
  37. </com.wj.myreboundscrollview.customview.MyReboundScrollView>  
  这里直接在外层包裹实现。注意,因为Myreboundscrollview是继承自Scrollview,因此要遵循Scrollview的使用原则,里面只能包含一个LinearLayout,所以无论里面多门复杂的布局,最后我们都要将其包含在一个LinearLayout中。

  ok,功能实现,效果也演示,具体需要使用直接拿来用就可以。

Android仿ios回弹效果 scrollview回弹 http://blog.youkuaiyun.com/aaawqqq/article/category/2162679 我的blog http://blog.youkuaiyun.com/aaawqqq/article/category/2162679 立即下载

相关推荐

Android 惯性回弹效果,支持所有view,仿ios惯性回弹,滚动惯性回弹

Android 惯性回弹效果,还在羡慕ios页面的回弹效果吗? Android 页面滚动惯性回弹 。支持所有view

Android学习笔记—界面上拉下拉实现回弹效果

界面上拉下拉实现回弹效果 当你的界面没有刷新功能的时候可以设置一个回弹效果,使用效果更佳 1. 在build.gradle中设置依赖 implementation 'com.lcodecorex:tkrefreshlayout:1.0.7' 2. 将你想要实现回弹效果的控件包裹起来 例如: <com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout android:id="@+id/over_scroll_view"

贪恋凡尘懒为仙的博客 1417

iOS仿淘宝详情页弹性上拉下拉效果

只包含上拉下拉效果实现DEMO,不含详情页其他内容布局代码

支付宝小程序页面禁止下拉

pullRefresh,这个属性设置没有用; onload中写入: my.setCanPullDown({ canPullDown:false }) true: 支持,false:不支持; 默认支持的;

weixin_42934142的博客 1674

仿朋友圈下拉顶部图片放大,带完美解决沉浸式状态栏

仿朋友圈下拉顶部图片放大,带完美解决沉浸式状态栏,类似CoordinatorLayout折叠式效果。采用PullToZoomScrollViewEx下拉顶部图片放大,上拉toolbar渐现。另附网上找了很久的沉浸式状态栏,简单实用。

Android 仿苹果底部弹出Dialog

style文件 <style name=ActionSheetDialogStyle parent=@android:style/Theme.Dialog> <!-- 背景透明 --> @android:color/transparent @null <!-- 浮于Activity之上 --> <item name=android:windowIsFloa

Android仿IOS上拉/下拉弹性效果ScrollView

效果图如下: 实现原理: Android自带的ScrollView滑动到顶部和底部后,就不能继续拖动了,因此要实现IOS的拉动弹性效果,可以自定义一个布局,继承ScrollView。 在最顶部时,可以向下拉动,并且弹回。 在最底部时,可以向上拉动,并且弹回。 不在最底部和最顶部时,就是默认的ScrollView的滑动效果。 如何判断ScrollView处于最顶部和最底部呢?// 最顶部时,Scr

The glory behind always be alone with. 2988

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4337

Android自定义控件

MeasureSpec是View的内部类,它封装了一个View的尺寸,在onMeasure()当中会根据这个MeasureSpec的值来确定View的宽高。自定义View在Android的开发中的重要性还是很大的,因为仅仅靠系统提供的控件和组件,无论是美观度还是使用度,再或者是新特性上,都无法满足特定的业务场景。layout()过程,对于View来说用来计算View的位置参数,对于ViewGroup来说,除了要测量自身位置,还需要测量子View的位置。这里我们介绍最复杂的一种,自定义View。

关注我!带你一路 "狂飙" 到底! 1558

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6504

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4767

Android实现背景图下拉回弹效果

Android实现背景图下拉回弹效果 增加设置不横向拉伸时增加回弹效果 增加切换横屏时可滑动效果 实现 public class HeadZoomScrollView extends NestedScrollView { public HeadZoomScrollView(Context context) { super(context); } public HeadZoomScrollView(Context context, AttributeSet at

qq_40709911的博客 2828

AI Agent在保险行业落地:从智能客服到核保理赔的实践路径

AI Agent作为大模型技术的核心应用形态,正从通用对话走向垂直行业深度落地。其本质是让机器理解自然语言、处理非结构化文档,并在复杂业务流程中辅助人类完成信息抽取、内容生成与多轮交互。在保险这一强监管、高客单价的行业中,智能客服与销售助手率先验证了降本增效的价值,核保与理赔环节则进一步展示了AI在文档理解与风控辅助上的高价值潜力。从技术原理到商业闭环,垂直场景正在成为AI应用的主战场。本文以保险行业为样本,剖析AI Agent如何嵌入真实业务流程,梳理可复用的三阶段落地路径,为企业在医疗、金融等类似高文本

weixin_29039773的博客 365

android仿ios弹性布局,Android仿IOS上拉下拉弹性效果的实例代码

用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好;Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果。先看效果,感觉有些时候还是蛮实用的。思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了。代码:自定义View,继承自Scrollview...

weixin_39848007的博客 390

【TC3xx芯片】TC3xx芯片看门狗复位的默认行为分析

TC3xx芯片看门狗复位的默认行为分析

qq_36056498的博客 350

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好;Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果。先看效果,感觉有些时候还是蛮实用的。思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了。代码:自定义View,继承自Scrollview...

weixin_42490307的博客 406

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

Android仿IOS上拉下拉弹性效果,同时利用颜色渐变,设置上拉下拉背景颜色不一致效果

一,仿IOS上拉下拉弹性效果(这个是借鉴的,亲测直接可用)         用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好,刚好最近项目需求要实现这种效果,刚好借鉴过来用,效果: 思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了。     自定义View,继承自Scrol...

zuo_er_lyf的博客 1555

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3038

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android仿IOS上拉下拉弹性效果 转自:http://blog.youkuaiyun.com/u014733374/article/details/42739345

用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好;Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果。先看效果,感觉有些时候还是蛮实用的。     思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了。     代码:

muzitest的专栏 1614

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

弹性上拉下拉ScroolView

根据文章 Android仿IOS上拉/下拉弹性效果ScrollView 优化而来的弹性ScrollView,可自定义下拉上拉的最大距离,也可设置阻碍系数,使滑动更有感觉 效果图 attr文件配置 控件代码 import android.animation.ObjectAnimator

cvsong的博客 666

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android上实现仿IOS弹性ScrollView

前言 IOS的UI和用户体验是它的优势, 与IOS相比, Android的UI和用户体验可能要差一些。 虽然Android版本已经到了4.4, 对系统的各个方法进行了大量实质性的优化, 但他的显示效果和交互体验依然不及IOS。 例如IOS上的很多控件都是带弹性的, 也就是用于拖拽一个控件到了该控件的边界, 但是控件依然可以随着手指的移动而移动一段距离。 这样的话, 给用户的感觉就不那么生

昨夜星辰的博客 1万+

android 底部上拉界面,Android 上拉下拉界面的弹性ScrollView效果实现

1.需求:像Ios那样上拉下拉实现动画回弹效果效果图:2.具体实现:继承ScrollView,重写dispatchTouchEvent()方法,判断上下滑动,计算距离,手指松开后实现动画效果,回到正常布局位置。实现代码:package com.mingyansu.splash;import android.annotation.SuppressLint;import android.content...

weixin_35986497的博客 683
上一篇: 关于5.0以下Android状态栏背景色变换
下一篇: Android系统定位服务
small_technical
博客等级 码龄11年 9粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值