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 的重用!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章