listview的上滑下滑监听,上下滑监听隐藏顶部选项栏的实例

listview的上滑下滑监听,来隐藏和显示顶部选项栏的特效,京东 同程等APP的资源列表都有此特效.

两个重点:

①listview的setOnTouchListener监听方法

当滑动的Y位置减去按下的Y位置大于最小滑动距离时则为向下滑动

反之,当按下的Y位置减去滑动的Y位置大于最小滑动距离则为向上滑动

②位移动画

就只要这两点需要注意的,直接上代码,注释很清楚。

package com.example.android_topbar_gone;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
  private RelativeLayout top_rl;
  private ListView listview;
  private List<Map<String, Object>>list = new ArrayList<Map<String,Object>>();
  private int mTouchShop;//最小滑动距离
  protected float mFirstY;//触摸下去的位置
  protected float mCurrentY;//滑动时Y的位置
  protected int direction;//判断是否上滑或者下滑的标志
  protected boolean mShow;//判断是否执行了上滑动画
  private Animator mAnimator;//动画属性
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化id
    setViews();
    //加载listview
    setListView();
  }
  /**
   * 初始化id
   */
  private void setViews() {
    top_rl = (RelativeLayout) findViewById(R.id.rl_ttt);
    listview = (ListView) findViewById(R.id.listview);
  }
  /**
   * 加载listview
   */
  private void setListView() {
    View header = View.inflate(this, R.layout.headview, null);//自定义一个头布局和顶部执行动画的布局等高就行
    listview.addHeaderView(header);//加载头布局
    //获得一个最小滑动距离
    mTouchShop = ViewConfiguration.get(this).getScaledTouchSlop();//系统级别的一个属性,判断用户的最小滑动距离的,可查看源码为16
    //给集合添加数据
    for (int i = 0; i < 40; i++) {
      Map<String, Object>map = new HashMap<String, Object>();
      map.put("str", "第"+i+"个item");
      list.add(map);
    }
    String a[] = {"str"};
    int b[] = {R.id.tv01};
    //simpleadapter加载集合数据
    SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item, a, b);
    listview.setAdapter(adapter);
    listview.setOnItemClickListener(new OnItemClickListener() {//listview的点击方法
      @Override
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
          long arg3) {
        Toast.makeText(MainActivity.this, list.get(arg2-1).get("str")+"", 0).show();//-1是因为加载的头布局
      }
    });
    listview.setOnTouchListener(new OnTouchListener() {//listview的触摸事件
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          mFirstY = event.getY();//按下时获取位置
          break;
        case MotionEvent.ACTION_MOVE:
          mCurrentY = event.getY();//得到滑动的位置
          if(mCurrentY - mFirstY > mTouchShop){//滑动的位置减去按下的位置大于最小滑动距离 则表示向下滑动
            direction = 0;//down
          }else if(mFirstY - mCurrentY > mTouchShop){//反之向上滑动
            direction = 1;//up
          }
          if(direction == 1){//判断如果是向上滑动 则执行向上滑动的动画
            if(mShow){//判断动画是否执行了 执行了则改变状态
              //执行往上滑动的动画
              tolbarAnim(1);
              mShow = !mShow;
            }
          }else if(direction == 0){//判断如果是向下滑动 则执行向下滑动的动画
            if(!mShow){//判断动画是否执行了 执行了则改变状态
              //执行往下滑动的动画
              tolbarAnim(0);
              mShow = !mShow;
            }
          }
          break;
        case MotionEvent.ACTION_UP:
          break;
        }
        return false;
      }
    });
  }

  private void tolbarAnim(int flag){
    if(mAnimator != null && mAnimator.isRunning()){//判断动画存在 如果启动了,则先关闭
      mAnimator.cancel();
    }
    if(flag == 0){
      mAnimator = ObjectAnimator.ofFloat(top_rl, "translationY", top_rl.getTranslationY(),0);//从当前位置位移到0位置
    }else{
      mAnimator = ObjectAnimator.ofFloat(top_rl, "translationY", top_rl.getTranslationY(),-top_rl.getHeight());//从当前位置移动到布局负高度的wiz
    }
    mAnimator.start();//执行动画
  }

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null"
    android:divider="@null"
    android:listSelector="@android:color/transparent"
    android:scrollbars="@null" >
  </ListView>

  <RelativeLayout
    android:id="@+id/rl_ttt"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#39caab"
    ></RelativeLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="50dp" >
  </RelativeLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#eeeeee" >
    <TextView
      android:id="@+id/tv01"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_marginLeft="18dp"
      android:text="第一个item"
      android:textColor="#646464"
      android:textSize="14dp" />
    <TextView
      android:layout_width="match_parent"
      android:layout_height="0.5dp"
      android:layout_alignParentBottom="true"
      android:background="#d2d2d2" />
  </RelativeLayout>
</RelativeLayout>

一个listview的滑动监听动画实现搞定 很好理解对吧。

以上这篇listview的上滑下滑监听,上下滑监听隐藏顶部选项栏的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android实现listview滑动时渐隐渐现顶部栏实例代码
  • Android 中实现ListView滑动隐藏标题栏的代码
(0)

相关推荐

  • Android 中实现ListView滑动隐藏标题栏的代码

    布局中listview要覆盖标题栏 int mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); //滑动监听 showHideTitleBar(true); ListView standby_lv = (ListView) findViewById(R.id.standby_lv); standby_lv.setOnTouchListener(new View.OnTouchListener() { @Override p

  • Android实现listview滑动时渐隐渐现顶部栏实例代码

    我在开发的时候遇到了这样的需求,就是在listview的滑动中,需要对顶部的栏目由透明慢慢的变为不透明的状态,就是以下的效果 最先开始的时候想的很简单,无非就是监听listview的滑动距离,然后根据距离算出透明度的比值,就可以了,但是事实上呢也的确是这样做的 只是在获取listview的滑动距离上可能没法直接获取,需要动态的去计算 下面贴出全部代码吧,不想码字了,最近感冒了,脑袋晕乎乎的,还疼,代码更直观一些 private void initListener() { lvList.setOn

  • listview的上滑下滑监听,上下滑监听隐藏顶部选项栏的实例

    listview的上滑下滑监听,来隐藏和显示顶部选项栏的特效,京东 同程等APP的资源列表都有此特效. 两个重点: ①listview的setOnTouchListener监听方法 当滑动的Y位置减去按下的Y位置大于最小滑动距离时则为向下滑动 反之,当按下的Y位置减去滑动的Y位置大于最小滑动距离则为向上滑动 ②位移动画 就只要这两点需要注意的,直接上代码,注释很清楚. package com.example.android_topbar_gone; import java.util.ArrayL

  • Vue3+vant+ts 上滑加载解决上滑调用多次数据的问题(推荐)

    之前用vue2的时候,写过vue2的用法,文末扩展知识点击查看,用得挺好的,也没啥问题,照葫芦画瓢的做出来了,但是有问题,下滑之后调用多次数据,按理说 组件通过 loading 和 finished 这俩变量控制加载状态,当组件滚动到底部时,会触发 load 事件并将 loading 设置成 true.此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可.若数据已全部加载完毕,则直接将 finished 设置成 true 即可. 但是我打印了一下,在调用方

  • ListView上滑和下滑,显示和隐藏Toolbar的实现方法

    1.准备Toolbar 先隐藏系统自带的actionbar,在AndroidManifest.xml文件<application>标签中: android:theme="@style/Theme.AppCompat.Light.NoActionBar"> (注意此处的Activity应继承AppCompatActivity) 再在布局文件中添加Toolbar,activity_main.xml文件中: <?xml version="1.0"

  • Nodejs文件上传、监听上传进度的代码

    前言 文件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用 Nodejs 配合前端完成这个功能. 前端我们使用 FormData 来作为载体发送数据. 效果 前端部分 HTML 部分 和 Js 部分 <input type="file" id="file" /> <!-- 进度条 --> <progress id="progress" value="0" max="10

  • 小程序上滑下滑效果的示例代码

    首先上视频 ,csdn上传视频还要上传到腾讯视频或者B站才能发,太捞了,视频之前录好了,弄成gif图将就看吧. 就像图里展示的那样,我要的是这种效果,滑动一下就进入下个页面,而不是划一下就动一点点. H5营销页面倒是很经常能看到这种效果. 本人前端菜鸡,百度了好久,都是什么touchstart和touchend,还有轮播图的实现效果. 但是我之前用过touchstart和touchend,感觉其实体验很不好. 在我的手机上能体现出明细的卡顿效果,有的时候还不生效,可能是在提醒我可以换手机了. 轮

  • Material Design系列之Behavior上滑显示返回顶部按钮

    效果预览 源码在文章末尾. 引文 有时候我们的页面内容过长的时候,滑动到页面底部用户再滑动到顶部很麻烦,Android不像iOS可以点击statusBar回到顶部,一般都是双击Toolbar/ActionBar或者在底部放一个按钮. 今天就底部放一个回到顶部按钮这个效果来做一个基于Behavior的实现.那么我们传统的方式来做就是监听这个滑动View,比如:ScrollView/ListView/RecyclerView/GridView等,那么如果我们使用了CoordinatorLayout,

  • android实现上滑屏幕隐藏底部菜单栏的示例

    本篇文章引用github上一个仿今日头条项目,项目地址: https://github.com/iMeiji/Toutiao ,主要实现的功能是底部菜单栏随用户手势滑动而变化可见状态 布局代码 这个功能实现起来比较简单,主要利用了CoordinatorLayout的 layout_behavior 的属性.具体代码如下: <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent&q

  • 微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)

    微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一) 页面缓存的设置优化了页面加载,减少了频繁的调取接口,使用户在断网的情况下有更好的体验. 每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync).wx.getStorage(wx.getStorageSync).wx.clearStorage(wx.clearStorageSync)可以对本地缓存进行设置.获取和清理.本地缓存最大为10MB. 注意: localSt

  • IOS实现上滑隐藏NvaigtionBar而下拉则显示效果

    先看看原APP的效果 实现过程 主要是给view中的滚动视图添加一个KVO来监视它的滑动,再根据它的offset来做一下操作,下面是代码 [myTableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil]; 获取tableView的 contentOffset 之后再根据具体需求来实

  • vue实现路由监听和参数监听

    1.路由携带数据跳转 routerAction(hideDisplays, data) { switch (hideDisplays) { case "pubAccountMenu": this.$router.push({ name: "AppAccountInfo", }); break; //在菜单路由上存储各种需要信息 case "publicDocInfoMenu": //菜单code: publicDocInfoMenu data.i

随机推荐