ViewPager控件, android3.0以后才有的. 特点: 预加载功能.
1.预加载左右两边的图片.
2.如果发现左边图片的索引是负数, 小于0, 就不会预加载.
3如果发现右边的图片是索引是大于等于总item的个数. 总item是: 2, 当前显示的是: 1
4无限循环---利用取模
android-support-v4.jar的源码位置:
sdk\extras\android\support\v4\src\java\android\support\v4\view\PagerAdapter.java
package com.myhome; import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by HQ on 2015/12/16. * --------- 日期 ------- 维护人 ------------ 变更内容 -------- * HQ 新增Person类 * HQ 增加sex属性 */ public class MainActivity extends Activity implements ViewPager.OnPageChangeListener { private static final String TAG = "MainActivity"; private List<ImageView> imageViewList; private MyAdapter adapter; private ViewPager mViewPager; private TextView tv_description; private LinearLayout ll_point; private String[] imageDescription; private int prevPoint = 0; //当前页面前一个点 boolean flag = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); new Thread(){ @Override public void run() { SystemClock.sleep(3000); while(!flag){ runOnUiThread(new Runnable() { @Override public void run() { mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1); } }); SystemClock.sleep(3000); } } }.start(); } @Override protected void onDestroy() { super.onDestroy(); flag = true; } private void initView() { mViewPager = (ViewPager) findViewById(R.id.viewpager); tv_description = (TextView) findViewById(R.id.tv_description); ll_point = (LinearLayout) findViewById(R.id.ll_point); initData(); adapter = new MyAdapter(); mViewPager.setAdapter(adapter); mViewPager.setOnPageChangeListener(this); //设置mor选中的点和图片对应的信息 prevPoint = 0; ll_point.getChildAt(prevPoint).setEnabled(true); tv_description.setText(imageDescription[prevPoint]); //把ViewPager设置为mor选中Integer.MAX_VALUE/2 int m = (Integer.MAX_VALUE/2)%imageViewList.size(); int currentPosition = Integer.MAX_VALUE/2-m; mViewPager.setCurrentItem(currentPosition); } private void initData() { imageDescription = new String[]{ "我是描述信息一.", "我是描述信息二...", "我是描述信息三....", "我是描述信息四....", "我是描述信息五......" }; int[] imageResIDs ={ R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, }; imageViewList = new ArrayList<>(); ImageView iv; View v; LinearLayout.LayoutParams params; for (int i = 0;i<imageResIDs.length;i++){ iv = new ImageView(this); iv.setBackgroundResource(imageResIDs[i]); //每次循环需要向LinearLayout中添加一个View对象 v = new View(this); v.setBackgroundResource(R.drawable.point_bg); params = new LinearLayout.LayoutParams(10,10); if (i != 0){ //当前不是第一个点需要设置左边距 params.leftMargin = 5; } v.setLayoutParams(params); v.setEnabled(false); imageViewList.add(iv); ll_point.addView(v); } } /** * 当页面滑动的时候调用此方法 * @param position * @param positionOffset * @param positionOffsetPixels */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** * 当页面被选中时调用此方法 * @param position 当前被选中的页面的索引 */ @Override public void onPageSelected(int position) { int newPosition = position%imageViewList.size(); //把当前选中的点给切换了,还有描述信息 ll_point.getChildAt(prevPoint).setEnabled(false); //ll_point.getChildAt(position).setEnabled(true); ll_point.getChildAt(newPosition).setEnabled(true); //tv_description.setText(imageDescription[position]); tv_description.setText(imageDescription[newPosition]); //把前一个的索引赋值给前一个索引变量,方便下一次再切换. //prevPoint = position; prevPoint = newPosition; } /** * 当页面的状态发生改变调用的方法 * @param state */ @Override public void onPageScrollStateChanged(int state) { } private class MyAdapter extends PagerAdapter{ /** * 返回的int值,会作为ViewPager的总长度来使用 * @return */ @Override public int getCount() { return Integer.MAX_VALUE; } /** * 判断是否使用缓存,如果返回的是true,使用缓存,不去调用instantiateItem方法创建一个新的对象 * @param view * @param object * @return */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 初始化一个条目 * @param container * @param position 就是当前需要加载条目的索引 * @return */ @Override public Object instantiateItem(ViewGroup container, int position) { //把position对应位置的ImageView添加到ViewPager中 //ImageView imageView = imageViewList.get(position); ImageView imageView = imageViewList.get(position%imageViewList.size()); mViewPager.addView(imageView); //把当前添加ImageView返回回去 return imageView; } /** * 销毁一个条目 * @param container * @param position 就是当前需要销毁条目的索引 * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { //把ImageView从ViewPager中移除掉 //mViewPager.removeView(imageViewList.get(position)); mViewPager.removeView(imageViewList.get(position%imageViewList.size())); } }
}
选择器xml文件
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:drawable="@drawable/point_foucs"></item> <item android:state_enabled="false" android:drawable="@drawable/point_normal"></item> </selector>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="5dp"></corners> <solid android:color="@android:color/white"></solid> </shape>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="5dp"></corners> <solid android:color="@android:color/darker_gray"></solid> </shape>
布局文件xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context="com.myhome.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="#66000000" android:orientation="vertical" android:padding="8dp"> <TextView android:id="@+id/tv_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是图片的描述信息" android:textSize="20dp" android:textColor="#FFFFFF"/> <LinearLayout android:padding="10dp" android:id="@+id/ll_point" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> </LinearLayout> </LinearLayout> </LinearLayout>
最后的效果图,自动播放