一个简单地ViewPager自定义的轮播图

这是学习到后自己写的一个简单地轮播图,有自定义的与轮播图同事轮转的点,图片,文字,如有雷同纯属模仿
package com.itkangda.viewpagerdemo;

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

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.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity implements OnPageChangeListener {

    private List<ImageView> imageViewList; // Viewpager的数据
	private ViewPager mViewPager;
	private LinearLayout llPointGroup;
	private TextView tvImageDescription;
	private String[] imageDescriptions;
	private int previousPosition = 0; // 前一个被选中的position
	
	private boolean isStop = false;
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		
		// 把正在循环切换的任务给停止掉
		isStop = true;
	}

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initView();
        
        new Thread(new Runnable() {
        	@Override
        	public void run() {
        		// 每隔5秒钟, 来切换一张图片
        		while(!isStop) {
        			System.out.println("正在切换图片..");
        			
        			// 运行在主线程中的任务
        			runOnUiThread(new Runnable() {
        				public void run() {
        					mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
        				};
        			});
        			SystemClock.sleep(5000);
        		}
        	}
        }).start();
    }

	private void initView() {
		mViewPager = (ViewPager) findViewById(R.id.viewpager);
		tvImageDescription = (TextView) findViewById(R.id.tv_image_description);
		llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
		
		initData();
		
		MyAdapter mAdapter = new MyAdapter();
		mViewPager.setAdapter(mAdapter); // 当执行完此行代码, ViewPager会去找MyAdapter去要数据.
		mViewPager.setOnPageChangeListener(this);
		
		// 设置默认选中的点和图片对应的描述信息.
		previousPosition = 0;
		llPointGroup.getChildAt(previousPosition).setEnabled(true);
		tvImageDescription.setText(imageDescriptions[previousPosition]);
		
		
		// 把ViewPager设置为默认选中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() {
		imageDescriptions = new String[] {
				"我是叶良辰",
				"有个bug",
				"加个点击事件",
				"点击的时候",
				"取消自动轮播"
		};
		
		int[] imageResIDs = {
				R.drawable.a,
				R.drawable.b,
				R.drawable.c,
				R.drawable.d,
				R.drawable.e
		};
		
		imageViewList = new ArrayList<ImageView>();
		
		ImageView iv;
		View v;
		LayoutParams params;
		for (int i = 0; i < imageResIDs.length; i++) {
			iv = new ImageView(this);
			iv.setBackgroundResource(imageResIDs[i]);
			imageViewList.add(iv);
			
			// 每循环一次需要向LinearLayout中添加一个点的view对象
			v = new View(this);
			v.setBackgroundResource(R.drawable.point_bg);
			params = new LayoutParams(5, 5);
			if(i != 0) {
				// 当前不是第一个点, 需要设置左边距
				params.leftMargin = 5;
			}
			v.setLayoutParams(params);
			v.setEnabled(false);
			llPointGroup.addView(v);
		}
	}
	
	class MyAdapter extends PagerAdapter {

		/**
		 * 返回的int的值, 会作为ViewPager的总长度来使用.
		 */
		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		/**
		 * 判断是否使用缓存, 如果返回的是true, 使用缓存. 不去调用instantiateItem方法创建一个新的对象
		 */
		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view == object;
		}

		/**
		 * 初始化一个条目
		 * position 就是当前需要加载条目的索引
		 */
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// 把position对应位置的ImageView添加到ViewPager中
			ImageView iv = imageViewList.get(position % imageViewList.size());
			mViewPager.addView(iv);
			// 把当前添加ImageView返回回去.
			return iv;
		}

		/**
		 * 销毁一个条目
		 * position 就是当前需要被销毁的条目的索引
		 */
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			// 把ImageView从ViewPager中移除掉
			mViewPager.removeView(imageViewList.get(position % imageViewList.size()));
		}
	}

	@Override
	public void onPageScrolled(int position, float positionOffset,
			int positionOffsetPixels) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * 当ViewPager页面被选中时, 触发此方法
	 * @param position 当前被选中的页面的索引
	 */
	@Override
	public void onPageSelected(int position) {
		
		int newPosition = position % imageViewList.size();
		
		// 把当前选中的点给切换了, 还有描述信息也切换
		llPointGroup.getChildAt(previousPosition).setEnabled(false);
		llPointGroup.getChildAt(newPosition).setEnabled(true);
		tvImageDescription.setText(imageDescriptions[newPosition]);
		
		// 把当前的索引赋值给前一个索引变量, 方便下一次再切换.
		previousPosition = newPosition;
	}

	@Override
	public void onPageScrollStateChanged(int state) {
		
	}
}
</pre><pre class="java" name="code">
XML处理
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="200dip" >
    </android.support.v4.view.ViewPager>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/viewpager"
        android:background="#77000000"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="5dip" >

        <TextView
            android:id="@+id/tv_image_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是默认的图片描述信息"
            android:textColor="#FFFFFF"
            android:textSize="16sp" />

        <LinearLayout
            android:id="@+id/ll_point_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dip"
            android:orientation="horizontal" >
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>
选择器
<div><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"></div><div>
</div><div>    <item android:drawable="@drawable/point_focus" android:state_enabled="true"></item>
    <item android:drawable="@drawable/point_normal" android:state_enabled="false"></item></div><div>
</div><div></selector></div>
选中状态点
<div><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" ></div><div>
</div><div>    <corners android:radius="5dip" /></div><div>
</div><div>    <solid android:color="@android:color/white" /></div><div>
</div><div></shape></div>
正常状态点
<div><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" ></div><div>
</div><div>    <corners android:radius="5dip" /></div><div>
</div><div>    <solid android:color="@android:color/darker_gray" /></div><div>
</div><div></shape></div>
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值