ViewPager详解(二)——自动轮播和手动切换完整示例

简介: MainActivity如下: package cn.ww;import android.app.Activity;import android.

MainActivity如下:

package cn.ww;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
 * @author http://blog.csdn.net/lfdfhl
 * 
 * Demo描述:
 * 1 ViewPager的自动轮播
 * 2 同时支持手动切换ViewPager的Item
 */
public class MainActivity extends Activity {
	private Context mContext;
	private Handler mHandler;
	private Runnable mRunnable;
	private ViewPager mViewPager;
	private ImageView[] dotImageViews;
	private final int INTERVAL =1000 * 3;
	private LinearLayout mDotsLinearLayout;
	private final static int SET_VIEWPAGER_ITEM =9527;
	private LauncherViewPagerAdapter mViewPagerAdapter;
	private PageChangeListenerImpl mPageChangeListenerImpl;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//去掉状态栏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				             WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.activity_main);
		init();
	}
	
	private void init() {
		mContext = this;
		mViewPager = (ViewPager) findViewById(R.id.guide_viewpager);
		mDotsLinearLayout = (LinearLayout) findViewById(R.id.dotsLinearLayout);
		mViewPagerAdapter = new LauncherViewPagerAdapter(mContext);
		mPageChangeListenerImpl = new PageChangeListenerImpl();
		mViewPager.setAdapter(mViewPagerAdapter);
		mViewPager.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				mViewPager.requestDisallowInterceptTouchEvent(true);
				return false;
			}
		});
		initDots();
		setAutoChangeViewPager();
	}
	

    //初始化小圆点
    private void initDots() {
        dotImageViews = new ImageView[mViewPagerAdapter.getCount()];
        for (int i = 0; i < dotImageViews.length; i++) {
            LinearLayout layout = new LinearLayout(mContext);
            ImageView imageView = new ImageView(mContext);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(20, 20));
            if (i == 0) {
                imageView.setBackgroundResource(R.drawable.guide_dot_white);
            } else {
                layout.setPadding(20, 0, 0, 0);
                imageView.setBackgroundResource(R.drawable.guide_dot_black);
            }
            dotImageViews[i] = imageView;
            layout.addView(imageView);
            mDotsLinearLayout.addView(layout);
        }
    }
    
    
    //ViewPager轮播
 	@SuppressWarnings("deprecation")
	private void setAutoChangeViewPager() {
		mViewPager.setOnPageChangeListener(mPageChangeListenerImpl);

		mHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				switch (msg.what) {
				case SET_VIEWPAGER_ITEM:
					if (mViewPagerAdapter != null && mViewPagerAdapter.getCount() > 0) {
						int currentItemIndex = mViewPager.getCurrentItem();
						int itemsCount = mViewPager.getAdapter().getCount();
						if ((currentItemIndex + 1) < itemsCount) {
							mViewPager.setCurrentItem(currentItemIndex + 1, true);
						} else {
							mViewPager.setCurrentItem(0, false);
						}
					}
					break;
				}
			}
		};

		mRunnable = new Runnable() {
			@Override
			public void run() {
				Message message = mHandler.obtainMessage();
				message.what = SET_VIEWPAGER_ITEM;
				mHandler.sendMessage(message);
				mHandler.removeCallbacks(mRunnable);
				mHandler.postDelayed(this, INTERVAL);
			}
		};

		mHandler.postDelayed(mRunnable, INTERVAL);
	}
    
    
    private class PageChangeListenerImpl implements ViewPager.OnPageChangeListener {
        @Override
        public void onPageSelected(int selected) {
            for (int i = 0; i < dotImageViews.length; i++) {
                dotImageViews[selected].setBackgroundResource(R.drawable.guide_dot_white);
                if (selected != i) {
                    dotImageViews[i].setBackgroundResource(R.drawable.guide_dot_black);
                }
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
           
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        	
        }

    }
    
    @Override
    protected void onDestroy() {
    	super.onDestroy();
    	if(null!=mViewPager){
    		mViewPager.removeAllViews();
            mViewPager = null;
    	}
    }
	
}

LauncherViewPagerAdapter如下:

package cn.ww;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;

public class LauncherViewPagerAdapter extends PagerAdapter {
	private Context mContext;
	private int[] pagesArray = {R.drawable.a,R.drawable.b, R.drawable.c, R.drawable.d};

	public LauncherViewPagerAdapter(Context context) {
		this.mContext = context;
	}

	@Override
	public int getCount() {
		return pagesArray.length;
	}

	@Override
	public Object instantiateItem(View container, int position) {
		View itemView = LayoutInflater.from(mContext).inflate(R.layout.guide_pager_adapter, null);
		itemView.setFocusable(true);
		ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
		imageView.setBackgroundResource(pagesArray[position]);
		((ViewPager) container).addView(itemView);
		return itemView;
	}


	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}

	@Override
	public void destroyItem(View container, int position, Object object) {
		((ViewPager) container).removeView((View) object);
	}
}

activity_main如下:

<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">

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

    <LinearLayout
        android:id="@+id/dotsLinearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="100px"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal">
    </LinearLayout>
    


</RelativeLayout>

guide_pager_adapter.xml如下:

<?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">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>


相关文章
|
9月前
|
搜索推荐 数据挖掘 API
微店商品详情接口(微店API系列)
微店商品详情接口是微店API的重要组成部分,帮助开发者和商家获取商品的详细信息(如标题、价格、库存等),并将其集成到应用程序或数据分析系统中。该接口支持HTTP GET/POST请求,返回JSON/XML格式数据,需通过AppKey和AppSecret进行身份验证和签名加密。应用场景包括商品信息同步、数据分析与市场调研、个性化推荐系统等,助力商业决策和业务拓展。
209 13
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
927 9
|
12月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
270 4
|
网络协议 算法 安全
【网络协议基础】TCP/IP协议大全
TCP/IP协议是现代计算机网络通信的基础,是互联网及局域网广泛使用的一套协议。TCP/IP协议集采用分层模型,以便于网络的设计、实现和管理。
746 2
|
数据挖掘 OLAP OLTP
OLAP与OLTP相比,各自的特点是什么?
【5月更文挑战第14天】OLAP与OLTP相比,各自的特点是什么?
302 0
|
数据库连接 应用服务中间件 数据库
Seata常见问题之访问seata 7091端口提示报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
1255 0
|
运维 监控 安全
阿里云香港轻量应用服务器评测,1核1G 30M 24元/月,低价VPS
阿里云香港轻量应用服务器评测,1核1G 30M 24元/月,低价VPS
5563 0
|
算法 安全 C#
Unity——热更新浅析
Unity——热更新浅析
238 0