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

标签:android,view,展示,隐藏
0
投稿

猜你喜欢

  • Java集合框架ArrayList源码分析(一)

    2022-05-12 19:32:50
  • Android高级动画篇之SVG矢量动画范例

    2022-09-28 11:01:00
  • Java在PDF中添加表格过程详解

    2022-12-24 20:32:04
  • 浅析Java编程中枚举类型的定义与使用

    2021-07-04 23:46:16
  • 深入浅析Java反射机制

    2023-11-25 07:02:03
  • Android实现志愿者系统详细步骤与代码

    2022-01-08 22:41:42
  • Android 文件数据存储实例详解

    2023-07-28 17:08:03
  • C#中Clone一个对象的值到另一个对象案例

    2022-10-11 21:41:14
  • Java8 CompletableFuture 异步多线程的实现

    2023-07-21 08:07:15
  • Unity代码实现序列帧动画播放器

    2023-03-24 23:48:45
  • unity3d实现七天签到功能

    2023-01-05 08:57:21
  • java实现删除某条信息并刷新当前页操作

    2022-06-26 07:12:12
  • SpringBoot中的multipartResolver上传文件配置

    2022-01-22 11:06:51
  • Android Xutils3网络请求的封装详解及实例代码

    2021-07-20 20:27:49
  • Java集合遍历实现方法及泛型通配

    2022-02-26 13:55:54
  • Springboot Vue实现单点登陆功能示例详解

    2023-11-05 00:29:11
  • Spring MVC的优点与核心接口_动力节点Java学院整理

    2023-11-28 05:43:36
  • 简单了解Java中的可重入锁

    2023-12-18 12:29:19
  • Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解

    2023-02-01 16:23:30
  • c# 线程定时器 System.Threading.Timer的使用

    2022-07-08 01:28:09
  • asp之家 软件编程 m.aspxhome.com