ViewPager左右滑动并带有圆点

上次写项目时遇到广告轮播图,使用viewpager实现左右滑动,并带有圆点,可以实现左右无限滑动,这里整理出来

了,希望大家多多指导,废话不多说了,有图有真相,先看看效果图吧!!!!     


图片大家看过了吧,效果是不是很赞啊,下面介绍代码部分吧

(1)大家先来看看布局吧,布局很简单,也没有什么好介绍的,大家自己看吧

<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/viewPager"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         >

        <LinearLayout
            android:id="@+id/viewGroup"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/mengceng"
            android:gravity="center"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>

(2)这一部分大家可以看看activity啦,核心的部分我已经注释的很详细了,我相信只要是学习过安卓的,并且认真思考了,都不会有什么困难的

public class MainActivity extends Activity {
	/**
	 * 将图片对应的imageView添加到listViews
	 */
	private List<View> listViews = new ArrayList<View>();
	private MyViewPagerAdp viewpagerAdp;
	/**
	 * ViewPager
	 */
	private ViewPager viewPager;
	/**
	 * 发送handler时用的tag
	 */
	private static final int MSG_CHANGE_PHOTO = 1;

	/** 图片自动切换时间 */
	private static final int PHOTO_CHANGE_TIME = 2000;
	/**
	 * 装点点的ImageView数组
	 */
	private ImageView[] tips;
	/**
	 * 把点点加到viewgroup中
	 */
	private ViewGroup mGroup;
	/**
	 * 是否发送过消息到handler
	 */
	private boolean isFirstSendMessage = false;
	/**
	 * 用于装载图片的list
	 */
	private List<Integer> mList = new ArrayList<Integer>();
	/**
	 * 实现图片自动变换的核心代码
	 */
	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MSG_CHANGE_PHOTO:
				int index = viewPager.getCurrentItem();//获得当前viewpager显示图片的下标
				viewPager.setCurrentItem(index + 1, true);//把viewpager图片设置成下一张
				mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO,
						PHOTO_CHANGE_TIME);
				break;

			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 把LinearLayout布局强制转化成ViewGroup,用于装载点点
		mGroup = (ViewGroup) findViewById(R.id.viewGroup);
		viewPager = (ViewPager) findViewById(R.id.viewPager);
		// 向mList添加图片
		mList.add(R.drawable.meinv1);
		mList.add(R.drawable.meinv2);
		mList.add(R.drawable.meinv3);
		mList.add(R.drawable.meinv4);
		mList.add(R.drawable.meinv5);
		mList.add(R.drawable.meinv6);
		// 清空listViews,主要在实际项目中的有刷新的时候用,防止图片重复
		// listViews.clear();
		// 创建imageView对象,并把其加入到listViews中
		for (int i = 0; i < mList.size(); i++) {
			ImageView iv = new ImageView(this);
			iv.setScaleType(ScaleType.CENTER_CROP);
			iv.setBackgroundResource(mList.get(i));
			listViews.add(iv);
		}
		viewpagerAdp = new MyViewPagerAdp(listViews);
		viewPager.setAdapter(viewpagerAdp);
		// 设置viewpager显示的图片
		viewPager.setCurrentItem(listViews.size());

		// 清空mGroup,主要在实际项目中的有刷新的时候用,防止点点重复
		// mGroup.removeAllViews();
		// 创建点点的数组
		tips = new ImageView[listViews.size()];
		for (int i = 0; i < tips.length; i++) {// 创建点点的imageView的对象,并把其加入到点点数组中
			ImageView imageView = new ImageView(this);
			imageView.setLayoutParams(new LayoutParams(
					LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));//设置点点的大小
			imageView.setPadding(15, 0, 0, 0);//设置点点的间距
			tips[i] = imageView;
			if (i == 0) {// 第一个设置成默认显示
				tips[i].setImageResource(R.drawable.focused);
			} else {
				tips[i].setImageResource(R.drawable.normal);
			}
			// 将点点对象添加的mGroup中
			mGroup.addView(imageView);
		}
		// 设置监听,主要是设置点点的背景
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageScrollStateChanged(int arg0) {

			}

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

			}

			@Override
			public void onPageSelected(int arg0) {
				// 设置选中的tip的背景
				setImageBackground(arg0 % listViews.size());
			}
		});
		mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO, PHOTO_CHANGE_TIME);
		// 这个主要是用来判断是否是第一次发送数据到handler,如果是第一次,就发送数据,否则在这里不发送;
		// 这个有效的解决啦,实际项目中刷新时,viewpager图片变换变快的问题,又刷新才会体现它的价值
		 if (!isFirstSendMessage) {
		 mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO,
		 PHOTO_CHANGE_TIME);
		 }
		 isFirstSendMessage = true;
	}

	/**
	 * 设置选中的tip的背景
	 * 
	 * @param selectItemsIndex
	 */
	private void setImageBackground(int selectItemsIndex) {
		for (int i = 0; i < tips.length; i++) {
			if (i == selectItemsIndex) {
				tips[i].setImageResource(R.drawable.focused);
			} else {
				tips[i].setImageResource(R.drawable.normal);
			}
		}
	}

}

(3)这个是adapter,其中有一点可能不太容易理解的地方,先看代码,待会我再解释

public class MyViewPagerAdp extends PagerAdapter {

	public List<View> mListViews;

	public MyViewPagerAdp(List<View> listViews) {
		this.mListViews = listViews;
	}

	@Override
	public void finishUpdate(View arg0) {
	}

	@Override
	public void notifyDataSetChanged() {
		super.notifyDataSetChanged();
	}

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

	@Override
	public Object instantiateItem(View arg0, final int arg1) {
		/*if (((ViewPager) arg0).getChildCount() == mListViews.size()) {
			((ViewPager) arg0).removeView(mListViews.get(arg1
					% mListViews.size()));
		}
		if(mListViews.get(arg1 % mListViews.size()).getParent() == null){
			((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
		}*/
		//优化之后
		if(mListViews.get(arg1 % mListViews.size()).getParent() == null&&((ViewPager) arg0).getChildCount() < mListViews.size()){
			((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
		}
		View view = mListViews.get(arg1 % mListViews.size());
		//为viewpager中的图片设置监听
		view.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//这里写监听响应的内容
				
			}
		});

		return mListViews.get(arg1 % mListViews.size());
	}

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

	@Override
	public void restoreState(Parcelable arg0, ClassLoader arg1) {
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	@Override
	public void startUpdate(View arg0) {
	}

	@Override
	public void destroyItem(View arg0, int arg1, Object arg2) {

	}

	

}


/*if (((ViewPager) arg0).getChildCount() == mListViews.size()) {
			((ViewPager) arg0).removeView(mListViews.get(arg1
					% mListViews.size()));
		}
		if(mListViews.get(arg1 % mListViews.size()).getParent() == null){
			((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
		}*/
这一部分虽然是注释的,但是我还是想啰嗦一下,第一个if目的就是为了不断的清除掉自己的孩子,以防止孩子会重复,当然了,在整理代码的时候,我已经意识到这是没有必要的啦,如果是有两个if,还是很必要的;第二个if,就是判断mListView中的view是否已经添加到viewpager中啦,没有则继续添加;这里后来我也意识到了,有浪费,下面介绍优化后的代码

if(mListViews.get(arg1 % mListViews.size()).getParent() == null&&((ViewPager) arg0).getChildCount() < mListViews.size()){
			((ViewPager) arg0).addView(mListViews.get(arg1 % mListViews.size()), 0);
		}
这个只需判断 mListView中的view是否已经添加到viewpager中,以及viewpager中孩子的数量是否小于mLisetview中view的数量,是则添加mListView中的view到viewpager中,只需添加mListView.size()次就可以啦,而上一种只要这个界面运行,他就会一直执行removeView和addView



  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值