Android 根据手势顶部View自动展示与隐藏效果
作者:不甘猿人 发布时间:2022-01-11 07:30:20
标签:android,view,展示,隐藏
首先来看一下效果:
大体思路如下:
总体布局用了一个自定义的ViewGroup,里面包了两个View(top View,bottomView)
我在bottomView里放了ViewPager,里面又有Fragment,Fragment里放的是ListView
原理:
ViewGroup在分发touchEvent的时候先通过手势GestureDetector判断手势方向,当向上滑动的时候让topView和bottomView同时向上移动,反之亦然。
整体思路不是很难如下是干货:
布局文件
<com.lin.gesturedetector.MyViewGroup
android:id="@+id/view_group"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/group_top"
layout="@layout/view_top" />
<include
android:id="@+id/group_bottom"
layout="@layout/view_bottom" />
</com.lin.gesturedetector.MyViewGroup>
手势监听重要的是打log看一下上下滑动是数值的变化,找到其规律:
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i(tag, "onScroll -> distanceY" + distanceY);
if (distanceY < 0) {// 手势向下滑动是负值
animatorLayoutOffset(1);
}
if (distanceY > 0) {
animatorLayoutOffset(0f);
}
return true;
}
一定记得在ViewGroup内查找控件需要在onFinishInflate后才能找到:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
viewTop = findViewById(R.id.group_top);
viewBottom = findViewById(R.id.group_bottom);
}
在ViewGroup布局的逻辑中需要处理的有一下几点:
1、onMeasure的时候要把子控件测量出来
2、onLayout时需要手动将子控件布局
接下来就是监听手势设置动画,不停的onLayout以达到topView和bottomView的布局效果
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
viewTop.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
viewBottom.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
setMeasuredDimension(width, height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int topHeight = viewTop.getMeasuredHeight();
float offset = layoutOffset * topHeight;
int width = r - l;
float topViewYTop = offset - topHeight;
float topViewYBottom = topViewYTop + topHeight;
viewTop.layout(0, (int) topViewYTop, width, (int) topViewYBottom);
viewBottom.layout(0, (int) topViewYBottom, width, (int) topViewYBottom + viewBottom.getMeasuredHeight());
}
private void animatorLayoutOffset(float offset) {
if (animator != null && animator.isRunning()) {
return;
}
animator = ObjectAnimator.ofFloat(this, "layoutOffset", layoutOffset, offset);
animator.setDuration(500);
animator.start();
}
项目地址在这:
GitHub
总结
以上所述是小编给大家介绍的Android 根据手势顶部View自动展示与隐藏效果网站的支持!
来源:http://blog.csdn.net/s1991721/article/details/77439850


猜你喜欢
- 以前看到过个:Java开发手册(阿里巴巴-公开版),这是个pdf文档,里面描述了一些Java开发的规约,里面确实有很多好用的规约,要是在学校
- 疑问都知道C#有装箱和拆箱的操作,听闻也都是讲int类型转换成object类型就是装箱,将object类型再转回int类型就是拆箱。描述的通
- 简介Flutter的audioplayers是一个Flutter插件,可以播放多个同时的音频文件,支持Android、iOS、Linux、m
- 前言在第一篇文字中,我们完全人工方式,一个命令一个命令输入,实现一个java tomcat运行环境,虽然也初见成效,但很累人。如果依靠依靠脚
- •静态构造函数既没有访问修饰符,也没有参数。•如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静
- 本文实例为大家分享了Unity3D撤回命令功能开发,供大家参考,具体内容如下在类似操作考核的项目中我们经常会遇到回到上一步的需求。所以我们有
- 本文实例讲述了C#使用linq对数组进行筛选排序的方法。分享给大家供大家参考。具体如下:using System;using System.
- 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Number可表示的最大
- 先看一下java线程运行时各个阶段的运行状态线程是进程中的一个实体,是被系 * 立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运
- Spring AOP预处理Controller的参数实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用比如有这样
- 最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。Ok,先上
- 1.更新MAC地址 将注册表中的键值添加上MAC地址2.重新连接网络 试过了3个方法: Ma
- 前段时间接到一个Web应用自动生成Word的需求,现整理了下一些关键步骤拿来分享一下。思路:(注:这里只针对WORD2003版本,其它版本大
- 本文介绍 Spring Boot 项目中整合 ElasticSearch 并实现 CRUD 操作,包括分页、滚动等功能。之前在公司使用 ES
- Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是总结的,放到这里用于后
- 0、引言在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一个无限父子结构,常见的有报表指标结构、菜单结构等。
- 使用Apache.POI中HSSFWorkbook导出到Excel,具体内容如下所示:1.引入Poi依赖(3.12)依赖如下:<dep
- 1. 包装类的介绍针对八种基本数据类型定义相应的引用类型--包装类(封装类),有了类的热点后,就可以调用类中的方法2. 基本数据类型 --&
- 效果如下:直接上代码,留着以后用,代码目录结构如下:其中BaseFragment.java是另外5个Fragment的基类,代码如下:pac
- 废话不多说了,直接给大家贴java代码了。import java.awt.Color; import java.awt.Grap