android fragment怎么监听上下滑动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android fragment怎么监听上下滑动相关的知识,希望对你有一定的参考价值。

android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动 。通常有两种方法:一种是单独实现setOnTouchListener监听器来,另一种是构建手势探测器

第一种方法,就是在要实现滑动的View中,实现OnTouchListener监听事件,然后判断KeyDonw和KeyUp 直接的位置距离来判断滑动方向,核心实现代码如下:

/**
    * 设置上下滑动作监听器
    * @author jczmdeveloper
    */
   private void setGestureListener()
       myView.setOnTouchListener(new OnTouchListener()

           @Override
           public boolean onTouch(View v, MotionEvent event)
               // TODO Auto-generated method stub
               switch (event.getAction())

               case MotionEvent.ACTION_DOWN:
                   mPosX = event.getX();
                   mPosY = event.getY();
                   break;
               case MotionEvent.ACTION_MOVE:
                   mCurPosX = event.getX();
                   mCurPosY = event.getY();

                   break;
               case MotionEvent.ACTION_UP:
                   if (mCurPosY - mPosY > 0
                           && (Math.abs(mCurPosY - mPosY) > 25))
                       //向下滑动
                       
                    else if (mCurPosY - mPosY < 0
                           && (Math.abs(mCurPosY - mPosY) > 25))
                       //向上滑动
                       collapse();
                   
                   
                   break;
               
               return true;
           

       );
   

第二种方法:就是构建手势探测器,如GestureDetector mygesture = new GestureDetector(this);,然后在onFling方法中根据MotionEvent的两个参数的 按下和滑动以及放开的位置和距离来判断滑动方向以及滑动速度等的。要构建GestureDetector,必须要和OnTouchListener一起使用,因为必须设置Touch监听,核心实现实例如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

public class TagScrollView extends FrameLayout implements OnTouchListener, OnGestureListener
   private float mPosX, mPosY, mCurPosX, mCurPosY;
   private static final int FLING_MIN_DISTANCE = 20;// 移动最小距离
   private static final int FLING_MIN_VELOCITY = 200;// 移动最大速度
   //构建手势探测器  
   GestureDetector mygesture = new GestureDetector(this);

   public TagScrollView(Context context)
       this(context, null);
   
   
   public TagScrollView(Context context, AttributeSet attrs)
       this(context, attrs, 0);
   
   
   public TagScrollView(Context context, AttributeSet attrs, int defStyle)
       super(context, attrs, defStyle);
       
       //setGestureListener();
       //设置Touch监听  
       this.setOnTouchListener(this);  
       //允许长按  
       this.setLongClickable(true);
   
   @Override
   public boolean onTouch(View v, MotionEvent event)
       // TODO Auto-generated method stub
       return mygesture.onTouchEvent(event);  
   

   @Override
   public boolean onDown(MotionEvent e)
       // TODO Auto-generated method stub
       return false;
   

   @Override
   public void onShowPress(MotionEvent e)
       // TODO Auto-generated method stub
       
   

   @Override
   public boolean onSingleTapUp(MotionEvent e)
       // TODO Auto-generated method stub
       return false;
   

   @Override
   public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
           float distanceY)
       // TODO Auto-generated method stub
       return false;
   

   @Override
   public void onLongPress(MotionEvent e)
       // TODO Auto-generated method stub
       
   

   @Override
   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
           float velocityY)
       // TODO Auto-generated method stub
       // e1:第1个ACTION_DOWN MotionEvent  
       // e2:最后一个ACTION_MOVE MotionEvent  
       // velocityX:X轴上的移动速度(像素/秒)  
       // velocityY:Y轴上的移动速度(像素/秒)  
         
       // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒  
       //向  
       if (e1.getY() - e2.getY() > FLING_MIN_DISTANCE)      
//                     && Math.abs(velocityX) > FLING_MIN_VELOCITY)      
           collapse();
             
       //向上  
       if (e2.getY() - e1.getY() > FLING_MIN_DISTANCE      
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY)
           
             
          return false;    
     
   


参考技术A view 或者 activity 实现 OnGestureListener 接口。
在 onScroll 方法中实现上下滑动:
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
Log.d("Fling", "Fling Happened!");
float x1 = e1.getX(), x2 = e2.getX();

if (x1 -x2 > 120)
if (mDirection != EAST)
mNextDirection = WEST;

Log.d(this.getClass().getName(), "To LEFT" + "(" + x1
+ "," + x2 + ")");
return (true);
else if (x1 - x2 < -120)
if (mDirection != WEST)
mNextDirection = EAST;

Log.d(this.getClass().getName(), "To Right" + "(" + x1
+ "," + x2 + ")");
return (true);


return false;

Android 联合ViewPager 与 Fragment

1 Fragment与Viewpager适配器

1.1 FragmentPageAdapter

  • 用于实现Fragment的滑动效果,使用Fragment来填充ViewPager
  • 适用于页面比较少的情况,FragmentPagerAdapter消耗更多的内存
  • 它会把每一个Fragment保存在内存 中,不用每次切换的时候,去保存现场,切换回来在重新创建,所以用户体验比较好
  • 而对 于Fragment比较多的情况,需要切换的时候销毁以前的Fragment以释放内存,就可以使用 FragmentStatePagerAdapter

1.2 FragmentStatePagerAdapter

  • 用于实现Fragment的滑动效果, 使用Fragment来填充ViewPager
  • 适用于页面比较多的情况,FragmentStatePagerAdapter省内存

2 创建 FragmentPageAdapter 适配器

  • 重写获取页面的方法public Fragment getItem(int position) { return fragmentList.get(position); }
  • 重写获取长度的方法 public int getCount() { return fragmentList.size(); }
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import java.util.List;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    // 定义Fragment列表来存放Fragment
    private List<Fragment> fragmentList;

    // 1. 定义构造方法
    public MyFragmentPagerAdapter(@NonNull FragmentManager fm, List<Fragment> listFragment) {
        super(fm);
        this.fragmentList = listFragment;
    }

    public MyFragmentPagerAdapter(FragmentManager fm, int behavior) {
        super(fm, behavior);
    }


    @NonNull
    @Override
    // 2. 显示页面,为数组中的Fragment’
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    // 3. 获取页面的个数,几位列表的长度
    public int getCount() {
        return fragmentList.size();
    }
}

2.1 切换不同的Fragment

// 设置索引显示fragment,
private void showFragment(int position) {

    // viewPage中的适配器,按照索引进行显示
    viewPager.setCurrentItem(position);  // 设置当前显示的位置
}

2.2 ViewPager滑动监听


    // 设置页数改变后的响应, 允许公共访问
    public class MyPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        // 页面滑动的时候
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        // 页面选中时调用
        public void onPageSelected(int position) {

            if (position == 0) {
                // 第一个页面的时候, 改变底部状态
                tab_1.setBackgroundColor(Color.RED);
                tab_2.setBackgroundColor(Color.WHITE);
                tab_3.setBackgroundColor(Color.WHITE);
            } else if (position == 1) {
                // 第二个页面的时候,改变底部状态
                tab_1.setBackgroundColor(Color.WHITE);
                tab_2.setBackgroundColor(Color.RED);
                tab_3.setBackgroundColor(Color.WHITE);
            } else if (position == 2) {
                tab_1.setBackgroundColor(Color.WHITE);
                tab_2.setBackgroundColor(Color.WHITE);
                tab_3.setBackgroundColor(Color.RED);
            }

        }

        @Override
        // 页面滑动时,状态改变
        public void onPageScrollStateChanged(int state) {

        }
    }

3 UI部分代码

  • 设置UI类为监听器
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // 定义控件
    private TextView tab_1, tab_2, tab_3;
    private ViewPager viewPager;  // 切换区
    private List<Fragment> fragmentList; // fragment数组
    private MyFragmentPagerAdapter myFragmentPagerAdapter;  // 适配器


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initUI();
        initTab();

    }

    // 初始化UI 获取控件,并设置监听器
    private void initUI() {

        tab_1 = findViewById(R.id.tab_1);
        tab_2 = findViewById(R.id.tab_2);
        tab_3 = findViewById(R.id.tab_3);
        tab_1.setOnClickListener(this);
        tab_2.setOnClickListener(this);
        tab_3.setOnClickListener(this);

        // 初始化切换区
        viewPager = findViewById(R.id.my_view_Pager);
    }

    // 显示Page以及其标签
    private void initTab() {
        // 1. 创建Page界面
        FragmentOne fragmentOne = new FragmentOne();
        FragmentTwo fragmentTwo = new FragmentTwo();
        FragmentThree fragmentThree = new FragmentThree();

        fragmentList = new ArrayList<>();

        // 添加到列表中
        fragmentList.add(fragmentOne);
        fragmentList.add(fragmentTwo);
        fragmentList.add(fragmentThree);

        // 3. 新建适配器
        myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragmentList);

        // 4. 设置适配器到viewPager
        viewPager.setAdapter(myFragmentPagerAdapter);

        // 5. 设置滑动监听
        viewPager.addOnPageChangeListener(new MyPageChangeListener());

        // 默认展示第一个界面
        showFragment(0);

    }

    // 设置索引显示fragment,
    private void showFragment(int position) {

        // viewPage中的适配器,按照索引进行显示
        viewPager.setCurrentItem(position);  // 设置当前显示的位置

        // 根据坐标设置底部按钮的颜色
        if (position == 0) {
            tab_1.setBackgroundColor(Color.RED);
            tab_2.setBackgroundColor(Color.WHITE);
            tab_3.setBackgroundColor(Color.WHITE);
        } else if (position == 1) {
            // 只有一个被选中,各个标签是冲突的
            tab_1.setBackgroundColor(Color.WHITE);
            tab_2.setBackgroundColor(Color.RED);
            tab_3.setBackgroundColor(Color.WHITE);

        } else if (position == 2) {
            tab_1.setBackgroundColor(Color.WHITE);
            tab_2.setBackgroundColor(Color.WHITE);
            tab_3.setBackgroundColor(Color.RED);
        }


    }

    @Override
    // 根据点击的View的ID 来改变下面标签的布局
    public void onClick(View v) {

        if (v.getId() == R.id.tab_1) {
            showFragment(0);
        } else if (v.getId() == R.id.tab_2) {
            showFragment(1);
        } else if (v.getId() == R.id.tab_3) {
            showFragment(2);
        }

    }


    // 设置页数改变后的响应, 允许公共访问
    public class MyPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        // 页面滑动的时候
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        // 页面选中时调用
        public void onPageSelected(int position) {

            if (position == 0) {
                // 第一个页面的时候, 改变底部状态
                tab_1.setBackgroundColor(Color.RED);
                tab_2.setBackgroundColor(Color.WHITE);
                tab_3.setBackgroundColor(Color.WHITE);
            } else if (position == 1) {
                // 第二个页面的时候,改变底部状态
                tab_1.setBackgroundColor(Color.WHITE);
                tab_2.setBackgroundColor(Color.RED);
                tab_3.setBackgroundColor(Color.WHITE);
            } else if (position == 2) {
                tab_1.setBackgroundColor(Color.WHITE);
                tab_2.setBackgroundColor(Color.WHITE);
                tab_3.setBackgroundColor(Color.RED);
            }

        }

        @Override
        // 页面滑动时,状态改变
        public void onPageScrollStateChanged(int state) {

        }
    }
}

在这里插入图片描述

以上是关于android fragment怎么监听上下滑动的主要内容,如果未能解决你的问题,请参考以下文章

在viewpager中图片滑动展示时图片与文字对应不上?

android开发中,怎么实现上下滑动,不是ScrollView,我要的是一次滑动整个页面,跟横向滑动效果一样。。

Android-Android ViewPager 怎么添加点击监听器

怎么监听webview的上下滑动事件

仿抖音上下滑动分页视频

Android 点击空白或滑动时候关闭软键盘(有scrollview的坑)