3个Fragment,中间图片轮播,结合分发拦截 实现自动轮播

版权声明:叮叮叮!!!! https://blog.csdn.net/Xuexx_520/article/details/83277619

MainActivity

package com.example.xxx.day15_baseactivity;


import android.app.Fragment;

import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
   private ViewPager viewPager;
   private ArrayList<Fragment> list;
   private FragmentAdapter adapter;
   private TabLayout tabs;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         //查找控件
        viewPager=findViewById(R.id.viewpager);
        list=new ArrayList<>();
        list.add(new AFragment());
        list.add(new BFragment());
        list.add(new AFragment());
        //添加适配
        adapter=new FragmentAdapter(getFragmentManager(),list);
        viewPager.setAdapter(adapter);
        //初始化Tab
        tabs=findViewById(R.id.tabs);
        tabs.addTab(tabs.newTab());
        tabs.addTab(tabs.newTab());
        tabs.addTab(tabs.newTab());
        tabs.setupWithViewPager(viewPager);
        tabs.getTabAt(0).setText("页面1");
        tabs.getTabAt(1).setText("页面2");
        tabs.getTabAt(2).setText("页面3");




    }
}

在BFragment设置自动轮播,并且handler发送消息实现2秒切换图片,再设置viewpager监听触摸状态

package com.example.xxx.day15_baseactivity;


import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.ArrayList;


/**
 * A simple {@link Fragment} subclass.
 */
public class BFragment extends Fragment {


   private ViewPager b_viewpager;
   private ArrayList<Integer> list;
   private Madapter ma;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int x = b_viewpager.getCurrentItem();
            x++;
            b_viewpager.setCurrentItem(x);
            send();
        }
    };
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_b, container, false);
        b_viewpager=view.findViewById(R.id.b_viewpager);
        list=new ArrayList<>();
        list.add(R.drawable.a);
        list.add(R.drawable.b);
        list.add(R.drawable.c);
        ma=new Madapter();
        b_viewpager.setAdapter(ma);
       //监听图片触摸状态
        b_viewpager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch(motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        handler.removeMessages(1);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        handler.removeMessages(1);
                        break;
                    case MotionEvent.ACTION_UP:
                        send();
                        break;
                }
                return false;
            }
        });
        return view;
    }

    //图片轮播适配
    class Madapter extends PagerAdapter{

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
            return view==o;
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            ImageView imageView=new ImageView(getActivity());
            imageView.setImageResource(list.get(position%list.size()));
            container.addView(imageView);
            return imageView;
        }

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView((View) object);
        }
    }
  //按Home停止发送
    @Override
    public void onPause() {
        super.onPause();
        handler.removeMessages(1);
    }
/*
    @Override
    public void onResume() {
        super.onResume();
        send();
    }*/

    public void send(){
        if (ma != null && ma.getCount()>0){
            //handler.removeMessages(1);
            handler.sendEmptyMessageDelayed(1,2000);
        }

    }
  //当滑动到当前fragment时继续发送消息
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser) {
            send();
        } else {
            handler.removeMessages(1);
        }
    }




}

分发拦截

BBFragment继承frameLayout重写分发拦截方法

package com.example.xxx.day15_baseactivity;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;

public class BBFragment extends FrameLayout {
    public BBFragment(Context context,AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

MViewpager继承ViewPager重写分发拦截方法

package com.example.xxx.day15_baseactivity;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class MViewPager extends ViewPager {
    int x=0;
    int x1=0;
    public MViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
       int currentItem=this.getCurrentItem();
       //第一张图
       if(currentItem%3==0){
           boolean flag=set(ev,currentItem);
           return flag;

       } else if(currentItem%3==2){//最后一张图
           boolean flag=set(ev,currentItem);
           return flag;
       } else {
           boolean flag=set(ev,currentItem);
           return flag;
       }

    }

    private boolean set(MotionEvent ev, int currentItem) {
         int action=ev.getAction();
         //滑动前开始位置
         if(action==MotionEvent.ACTION_DOWN){
             x= (int) ev.getX();
         }
         //滑动到的位置
        if (action == MotionEvent.ACTION_MOVE){
            x1 = (int)ev.getX();
        }
        //第一张图片滑动完毕
        if(currentItem%3==0&&x1-x>0){
             return false;
        }
        //最后一张图片滑动完毕
        if(currentItem%3==2&&x1-x<0){
             return false;
        }
        return super.onTouchEvent(ev);

    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<com.example.xxx.day15_baseactivity.BBFragment 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"
    tools:context=".BFragment">

    <!-- TODO: Update blank fragment layout -->
    <com.example.xxx.day15_baseactivity.MViewPager
        android:id="@+id/b_viewpager"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </com.example.xxx.day15_baseactivity.MViewPager>

</com.example.xxx.day15_baseactivity.BBFragment>

猜你喜欢

转载自blog.csdn.net/Xuexx_520/article/details/83277619