Android ViewPager自定义轮播图并解决播放冲突

本文实例为大家分享了Android ViewPager自定义轮播图,并解决播放冲突,供大家参考

首先介绍一下这篇小代码:

注释全面,简单易学,适用初学者,图片自拟!!!

一定要将ArrayList集合&Handler机制传到适配器,否则无法完成展示,也解决不了滑动冲突,代码有点多,但是它通俗易懂啊

layout布局内写法:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager01"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    </RadioGroup>

</LinearLayout>

Activity内写法:

public class Frag_01 extends Fragment {
 private RadioGroup radioGroup;
 private ViewPager pager;

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.frag_01, container, false);
  // 找Viewpager控件
  radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup);
  pager = (ViewPager) view.findViewById(R.id.pager01);

  // 图片数据自拟-->drawable文件夹下
  int arr[] = { R.drawable.a1, R.drawable.a2, R.drawable.a3,
    R.drawable.a4, R.drawable.a5 };
  final ArrayList<ImageView> list = new ArrayList<ImageView>();
  for (int i = 0; i < arr.length; i++) {
   ImageView imageView = new ImageView(getActivity());
   imageView.setImageResource(arr[i]);
   list.add(imageView);
   // 生成小圆点
   RadioButton radioButton = new RadioButton(getActivity());
   radioGroup.addView(radioButton);
  }

  // 默认选中第一个
  radioGroup.check(radioGroup.getChildAt(0).getId());

  // 适配器
  pager.setAdapter(new MyPagerAdapter(list, handler));

  // 页面切换监听
  pager.setOnPageChangeListener(new OnPageChangeListener() {

   @Override
   public void onPageSelected(int arg0) {
    //根据页面索引控制小圆点切换
    arg0 %= list.size();
    radioGroup.check(radioGroup.getChildAt(arg0).getId());

   }

   @Override
   public void onPageScrolled(int arg0, float arg1, int arg2) {
    // TODO Auto-generated method stub

   }

   @Override
   public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

   }
  });
  //handler发送消息
  handler.sendEmptyMessageDelayed(0, 3000);
  return view;
 }

        //Handler机制-----------------------------------------

 Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   switch (msg.what) {
   case 0:
    //获取到下一页的条目--->赋值给当前条目
    int currentItem = pager.getCurrentItem() + 1;
    pager.setCurrentItem(currentItem);
    handler.sendEmptyMessageDelayed(0, 3000);
    break;

   default:
    break;
   }
  };
 };
}

PagerAdapter适配器的写法:(内含滑动冲突解决方案)

public class MyPagerAdapter extends PagerAdapter {

 private ArrayList<ImageView> list;
 private Handler handler;
 //构造
 public MyPagerAdapter(ArrayList<ImageView> list, Handler handler) {
  super();
  this.list = list;
  this.handler = handler;
 }

 @Override
 public int getCount() {
  // 设置最大值
  return Integer.MAX_VALUE;
 }

 @Override
 public boolean isViewFromObject(View arg0, Object arg1) {
  //当前视图和新加载视图判断-->为真才能去销毁
  return arg0 == arg1;
 }

 // 添加视图
        // ----该方法内包含滑动冲突----
 @Override
 public Object instantiateItem(ViewGroup container, int position) {
  position %= list.size();
  ImageView imageView = list.get(position);
  imageView.setOnTouchListener(new OnTouchListener() {

   @Override
   public boolean onTouch(View v, MotionEvent event) {
    // 获取事件
    int action = event.getAction();
    switch (action) {
    case MotionEvent.ACTION_MOVE:// 滑动
     handler.removeCallbacksAndMessages(null);
     break;
    case MotionEvent.ACTION_DOWN:// 按下
     handler.removeCallbacksAndMessages(null);
     break;
    case MotionEvent.ACTION_CANCEL:// 非人为操作
     handler.sendEmptyMessageDelayed(0, 3000);
     break;
    case MotionEvent.ACTION_UP:// 抬起
     handler.sendEmptyMessageDelayed(0, 3000);
     break;
    }
    return true;
   }
  });
  //获取的图片存进容器
  container.addView(imageView);
  return imageView;
 }

 // 销毁视图
 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
  container.removeView((View) object);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • 浅谈Viewpager和轮播图的冲突解决方法

    实例如下: //解决ViewPager和轮播图滑动冲突 @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // 让当前viewpager的父控件不去拦截touch事件 getParent().requestDisallowInterceptTouchEvent(true); downX = (int) ev.ge

  • viewpager实现自动循环轮播图

    本文实例为大家分享了viewpager自动循环轮播图的具体代码,供大家参考,具体内容如下 布局文件 android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:layout_width="match_parent" and

  • ViewPager打造轮播图Banner/引导页Guide

    前言 去年7月时,在Github发布了一个开源的Banner库,虽然Star不多,但还是有少部分人使用. Banner效果: Github链接地址:https://github.com/Allure0/LMBanners 昨天,有使用此库的同学提出需求,想在引导页的时候用这个库并且最后一页有进入按钮如何实现,为满足他的需求,也方便更多开发者是快速实现.进行了简单的扩展支持Guide模式的使用. Guide效果图: OK,效果如图所以,咱们此库满足了既可在Banner上使用也可以快速在第一次安装应

  • Android 使用ViewPager实现轮播图效果

    写这篇文章只是对今天所学的知识进行加深印象,对ViewPager的一些处理,比如适配器和各个方法的作用等. 先看效果图 这里我是在xml中写的圆点 Drawable文件夹下的xml代码: Shape_yes.xml: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

  • Android使用RollViewPager实现轮播图

    记录Android中轮播图的学习与使用,供大家参考,具体内容如下 1.build.gradle(:app)文件里面加依赖 implementation 'com.jude:rollviewpager:1.2.9' 2.activity_main.xml <com.jude.rollviewpager.RollPagerView android:id="@+id/roll_view_pager" android:layout_width="match_parent&quo

  • Android Viewpager实现无限循环轮播图

    在网上找了很多viewpager实现图片轮播的,但是大多数通过以下方式在PagerAdapter的getCount()返回一个无限大的数,来实现 伪无限 @Override public int getCount() { return Integer.MAX_VALUE;//返回一个无限大的值,可以 无限循环 } 虽然通过这种方式是能达到效果,但是从严格意义上来说并不是真正的无限. 假如有五张轮播图 item的编号为(0,1,2,3,4) 要想实现 无限循环  我们在这五张的头部和尾部各加一张即

  • Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件

    最近用到需要无限轮播自动播放的轮播轮播图,网上感觉都有这样那样的问题,于是自己写了一个通用的控件CarouselFigureView. 特点: 1.可以轮播view可以自己定义,不一定是要是ImageView2.指示器默认显示,但是可以隐藏3.可以设置指示器的颜色.间距.大小 4.有基础的可以自己修改代码改变指示器位置,这个应该不难5.可以自己开启和关闭自动轮播,开启轮播的时候可以设置轮播时间间隔,默认3000毫秒 我们先来看看效果图: 然后来看看使用代码 xml代码 <?xml version

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android使用viewpager实现自动无限轮播图

    1.具体步骤 说下大概实现步骤,一般我们有两种,一种是viewpager+作为游标的点 .另外一种是重写viewpager. 效果图: 1.1 布局,直接viewpager+一个viewgroup就好. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:

随机推荐