Android 如何实现 焦点图的 无线循环滑动的状态?



参考网址:http://my.oschina.net/xsk/blog/119167

整体的架构:ViewPgaer 中直接嵌套  IamgeView

方案一:  重写Viewpager 这样有局限性。 这里的案例是 本地静态的图像

原本的实现原理: 这里是一种模拟方式 实现的 “无线的循环”, 其实并不是 真正意义上的无线循环。 而是 设置的值很大,用于 当做 无线循环。

设置默认选中的很大的值:

 viewPager.setCurrentItem(100000 * imageResId.length);


在 PagerAdapter  初始化的方法中: 只需要  创建一个 ImageView  即可!


代码:

package stu.hades;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.example.hadesviewpagerdemo.R;

public class MyViewPager extends ViewPager {
	
	 protected Context mContext = null;
	 protected ViewPager viewPager = null;

	    //1、定义图片资源数组,有几个就写几个,也可以动态填充
	 public static int[] imageResId = new int[] {R.drawable.aaa,R.drawable.aab, R.drawable.aac,R.drawable.aad};

	    //2、初始化一些参数
	 public MyViewPager(Context context, AttributeSet attrs) {
	        super(context, attrs);
	        this.mContext = context;
	        viewPager = this;
	 }
	 
	//3、视图初始化后配置适配器和监听
	    @Override
	    protected void onFinishInflate() {
	        super.onFinishInflate();
	        viewPager.setAdapter(new MyAdapter(mContext));
	        //设定启示位置,设这么大,以便可以左循环100000次,应该没有人滑动这么频繁吧!
	        viewPager.setCurrentItem(100000 * imageResId.length);
	        viewPager.setOnPageChangeListener(new MyPageChangeListener());
	    }

	    //3、图片更改监听器
	    private class MyPageChangeListener implements OnPageChangeListener {
	    	
	        protected int oldPosition = 0;

	        //下面里是显示当前图片位置的圈圈,这里是个参考,大家可以自己写,即便注释不影响滑动
	        public void onPageSelected(int position) {
//	            LinearLayout image_viewpager_circle = (LinearLayout) ((RelativeLayout) viewPager.getParent()).findViewById(R.id.main_image_viewpager_circle);
//	            ((ImageView) image_viewpager_circle.getChildAt(oldPosition)).setImageResource(R.drawable.dot_normal);
//	            ((ImageView) image_viewpager_circle.getChildAt(position% imageResId.length)).setImageResource(R.drawable.dot_focused);
	            oldPosition = position % imageResId.length;
	        }

	        public void onPageScrollStateChanged(int arg0) {

	        }

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

	        }
	    }

	    @Override
	    protected void onMeasure(int arg0, int arg1) {
	        super.onMeasure(arg0, arg1);
	    }
	
}


2  adapter

package stu.hades;

import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;

public class MyAdapter extends PagerAdapter {

	public Context mContext;

	public MyAdapter(Context mContext) {
		this.mContext = mContext;
	}

	// 给适配设定元素数最大值,可以无限右滑动,左滑动不能超过100000次
	@Override
	public int getCount() {
		return Integer.MAX_VALUE;
	}

	@Override
	public int getItemPosition(Object object) {
		// TODO Auto-generated method stub
		return super.getItemPosition(object);
	}

	// 这个大家都懂的,用法可以百度或者OSCHINA一下,我白话文:每次初始化当前视图和左右两侧的视图
	@Override
	public Object instantiateItem(View arg0, int position) {
		// TODO Auto-generated method stub
		int posi = position % MyViewPager.imageResId.length;

		// 每次添加新视图,虽然有点耗资源,但不会有冲突,并且在视图切换过程中,会销毁无用的视图。
		ImageView xImageView = new ImageView(mContext);
		xImageView.setBackgroundResource(MyViewPager.imageResId[posi]);
		android.view.ViewGroup.LayoutParams para = new android.view.ViewGroup.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		xImageView.setAdjustViewBounds(true);
		xImageView.setLayoutParams(para);
		((ViewPager) arg0).addView(xImageView, 0);
		return xImageView;
	}

	@Override
	public void destroyItem(View arg0, int position, Object arg2) {
		// 销毁不需要的视图
		((ViewPager) arg0).removeView((View) arg2);
	}

	@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 finishUpdate(View arg0) {

	}
}

代码网址:http://pan.baidu.com/s/1pJMDVMb


参考方案 二:  不重写 VIewpager 

    直接使用Viewpager, 但是 一样需要设置 VIewpager.setCurrentItem();


注意:  很重要的一点 VIewpager 中  ImageView 的重用问题, 不要每一都创建很麻烦。

VIewPgaer重用: 自己再往搜一下, 原理很简单。就是讲ImageView放到 集合中, 通通过 add(ImageView)   remove() 实现 ImageView 的重用!



你可能感兴趣的:(广告栏的无限循环)