类似于iOS有阻尼效果的滑动控件,一般我们比较亲切地称之为果冻控件

比较常见的地方,如微信里[我]的那个面板模块,即使没有再多的选项,也不会很生硬的不允许用户滑动。

微信是的处理方法是让用户滑动,但最终还是回滚到最初的地方,这样的效果很生动(毕竟成功还是取决于细节)。那么在安卓我们要怎么弄呢。下面为大家介绍一下JellyScrollView,是我继承ScrollView的一个有阻尼的效果的果冻滑动控件。废话少说,看图…

(在虚拟机或者真机跑起来是很流畅,可能是录制视频做成gif的时候有点卡顿。)

实现原理:其实只需要重写下它的拦截方法的逻辑就好了,ScrollView的拦截方法onInterceptTouchEvent一般情况下都默认地返回false,表示不拦截该事件。(如果不了解事件机制的同学先补补基础touch事件的分发和消费机制)我们只需要在用户滑动了界面的情况下,拦截下来并移动布局就好了,当用户松开手就恢复布局。很简单

第一步:集成ScrollView重写几个构造方法;
第二步:重写下onFinishInflate方法,获得第一个子view;
第三步:在拦截方法里面处理上面所说的逻辑;

public class JellyScrollView extends ScrollView {private View inner;// 子Viewprivate float y;// 点击时y坐标private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)private boolean isCount = false;// 是否开始计算private boolean isMoving = false;// 是否开始移动.private int top;// 拖动时时高度。private int mTouchSlop;//系统最少滑动距离public JellyScrollView(Context context) {super(context);}public JellyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public JellyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();}/**** 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate* 方法,也应该调用父类的方法,使该方法得以执行.*/@Overrideprotected void onFinishInflate() {if (getChildCount() > 0) {inner = getChildAt(0);}}/**拦截事件*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if (inner != null) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:y = ev.getY();top = 0;break;case MotionEvent.ACTION_UP:// 手指松开.isMoving = false;if (isNeedAnimation()) {animation();}break;/**** 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到,* 因为此时是ScrollView的touch事件传递到到了ListView的子item上面.所以从第二次计算开始.* 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行.*/case MotionEvent.ACTION_MOVE:final float preY = y;// 按下时的y坐标float nowY = ev.getY();// 每时刻y坐标int deltaY = (int) (nowY - preY);// 滑动距离if (!isCount) {deltaY = 0; // 在这里要归0.}if (Math.abs(deltaY) < mTouchSlop && top <= 0)return true;// 当滚动到最上或者最下时就不会再滚动,这时移动布局isNeedMove();if (isMoving) {// 初始化头部矩形if (normal.isEmpty()) {// 保存正常的布局位置normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());}// 移动布局inner.layout(inner.getLeft(), inner.getTop() + deltaY / 3, inner.getRight(), inner.getBottom() + deltaY / 3);top += (deltaY / 6);}isCount = true;y = nowY;break;}}return super.onInterceptTouchEvent(ev);}/**** 回缩动画*/public void animation() {// 开启移动动画TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top);ta.setDuration(200);inner.startAnimation(ta);// 设置回到正常的布局位置inner.layout(normal.left, normal.top, normal.right, normal.bottom);normal.setEmpty();// 手指松开要归0.isCount = false;y = 0;}// 是否需要开启动画public boolean isNeedAnimation() {return !normal.isEmpty();}/**** 是否需要移动布局* inner.getMeasuredHeight():获取的是控件的总高度* getHeight():获取的是屏幕的高度** @return*/public void isNeedMove() {int offset = inner.getMeasuredHeight() - getHeight();int scrollY = getScrollY();// scrollY == 0是顶部// scrollY == offset是底部if (scrollY == 0 || scrollY == offset) {isMoving = true;}}
}

然后在布局里面在最外层就使用我们的JellyScrollView
(为了方便展示,我只是大概写了一部分布局代码)

<?xml version="1.0" encoding="utf-8"?>
<cn.ichengxi.fang.view.JellyScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/bg"android:scrollbars="none"><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextView
            android:id="@+id/personal_setting_txt"android:layout_width="match_parent"android:layout_height="wrap_content"android:alpha="0.8"android:gravity="center_vertical"android:text="设置"android:textColor="@android:color/black" /></LinearLayout></cn.ichengxi.fang.view.JellyScrollView>

然后就可以很优雅的实现了果冻控件的效果啦。。。成功的同学记得回来点赞

Android果冻效果滑动控件相关推荐

  1. android 光晕动画,Android去掉SrollView、GrdiView、RecycleView、ViewPager等可滑动控件滑动到边缘的光晕效果...

    下面以RecycleView为例,其他可滑动控件也是一样的 在XML中设置: android:id="@+id/rv_recycle_view" android:layout_wi ...

  2. Android左右滑动控件实现开关的切换效果

    /**  * 开关控件,通过左右滑动控件实现开关的切换效果 <br>  * 使用时需要设置开关状态监听{@link OnSwitchStateChangeListener} <br& ...

  3. Android无限滑动控件实现

    无限滑动控件 无限滑动控件的预期效果是添加有限个View实现无限滑动的效果. 我的实现是通过重写dispatchDraw,对canvas画布进行偏移达到无限滑动的效果. 效果如图: github地址: ...

  4. Android双向滑动控件

    Android双向滑动控件 kaxi4it 关注 一 效果图 二 使用方法 由于新版jcenter强制添加组织还要收费貌似,所以改用jitpack了 最新版本号 在你root的gradle中添加引用 ...

  5. Android开源库集合(控件)

    RecycleView: RecycleView功能增强 https://github.com/Malinskiy/SuperRecyclerView RecycleView功能增强(拖拽,滑动删除, ...

  6. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  7. 基于webview的选择滑动控件(PC和wap版)

    有了webview,大家开发ios或者安卓的app就方便很多啦. 第一可以增量更新: 第二webview可以同时兼容ios和安卓,减少开发量哦. --------------------------- ...

  8. android自定义刻度线,Android自定义控件之刻度尺控件

    今天我做的是一个自定义刻度尺控件,由于项目需求需要使用刻度尺那样滑动选择,由于对自定义控件的认识还不够深入,于是花了一周多时间才把这个控件给整出来,也是呕心沥血的经历啊,也让我对自定义控件有了自己的认 ...

  9. Android拼图滑块验证码控件

    大咖好,博主毕业工作半年多了.今天给大噶呈献博主博客处女作--Android拼图滑块验证码控件.由于初写博客,很多地方可能不够好,望各位多多给点意见.工作半年才送出第一篇博客很惭愧555. 概述 验证 ...

最新文章

  1. postgresql存图片字段类型_PostgreSQL 入门 | Linux 中国
  2. struts 页面取值问题
  3. c# poi写入e_C# 面向对象 静态类和静态成员
  4. 【 FPGA 】时序分析中的基本概念和术语
  5. 死磕Java并发:J.U.C之Java并发容器:ConcurrentLinkedQueue
  6. IE – File - Work Offline
  7. mysql基础(DQL语言、DML语言、DDL语言)详解
  8. 京东2019春招Java工程师编程题题解
  9. python的子子孙孙(变种编程语言)
  10. php不缓存直接输出,如何在PHP中禁用输出缓冲
  11. nginx的模块化体系结构
  12. C语言结构体对齐[转]
  13. 把excel数据生成sql insert语句
  14. 硬盘坏了怎么恢复数据,需要哪些设备
  15. html下拉菜单的写法
  16. 大数据与云计算的理解与基本认识
  17. 全面解析 UI/UE/交互设计
  18. 刀塔霸业怎么在电脑上玩 刀塔霸业电脑版玩法教程
  19. 《神经网络与深度学习》(Michael Nielsen)Neural Networks and Deep Learning习题解答汇总
  20. 《XP、面具框架玩机》小米手机玩机教程--菜鸟小回

热门文章

  1. 关于对中医现状的想法
  2. Web 易用性大师 Jakob Nielsen 访谈录
  3. ArcGIS导出AI或EPS格式的地图图片并在Adobe Illustrator中继续编辑
  4. Direct3D模板技术
  5. 锤子和学姐的故事——面对爱情,你的勇气有多大?
  6. 小米怎么和计算机连接网络设置密码,小米路由器手机怎么设置无线网络 手机设置小米路由器密码教程...
  7. 为什么oracle要静默安装程序,静默安装 Oracle数据库软件
  8. 百度爱采购运营推广的小妙招@运营猫工具箱
  9. Chinese Lovers’ Day
  10. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互