揚州旅遊app(四)

如果轉載,請註明出處,謝謝。

之前我們寫的主頁面,樣子太搓。先上圖。

圖中,最上面的ImageView特別的醜。於是就想改一下,做成PC端很流形的大圖輪轉。

完成的效果是這個樣字的,我先文字描述一下,我們這裏有6張圖,可以手勢左右滑動,同時動態的每隔2秒鐘跳轉到下一張圖片。大致流程就是這樣。

上圖:

在這裏我們需要把普通的ImaeView改成ViewPager。而ViewPager是無法直接使用的,我次奧。

爲了使用使用ViewPager,我們去Android Private libraries目錄下的android-support-v4.jar包下面的android.support.v4.view包下面,找到ViewPager.class。拷貝路徑,在xml文件裏引用

把原來的

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dip"
        android:src="@drawable/ad" />
替換成

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="200dp" 
        android:id="@+id/view_pager">

定義完組件後,我們去可以去實現邏輯代碼了。
來到HomeActivity。
先初始化view_pager
private ViewPager view_pager;
然後通過id找到組件,並設置其適配器
view_pager = (ViewPager) findViewById(R.id.view_pager);
view_pager.setAdapter(adapter2);
接着,我們去自定義適配器,這裏要注意的是,不是去繼承BaseAdapter,還是去繼承PagerAdapter

上代碼

	private class MyViewPagerAdapter extends PagerAdapter {
		/**
		 * 返回圖片個數
		 */
		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {

			return view == object;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {

			container.removeView((View) object);
			object = null;
		}

		/**
		 * 獲得相應位置上的view container view的容器,其實就是viewpager自身 position 相應的位置
		 */
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// TODO Auto-generated method stub
			// 給 container 添加一個view
			container.addView(imageList.get(position % imageList.size()));
			// 返回一個和該view相對的object
			return imageList.get(position % imageList.size());
		}

	}

在實現其未實現的方法的時候,系統只給了兩個,即
	@Override
	public int getCount() {
	    return Integer.MAX_VALUE;
	}

	@Override
	public boolean isViewFromObject(View view, Object object) {
            return view == object;
	}
我們要把另外兩個也實現了。
這裏的
		/**
		 * 獲得相應位置上的view container view的容器,其實就是viewpager自身 position 相應的位置
		 */
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// TODO Auto-generated method stub
			// 給 container 添加一個view
			container.addView(imageList.get(position % imageList.size()));
			// 返回一個和該view相對的object
			return imageList.get(position % imageList.size());
		}

相當於繼承Basedadapter時候實現的getView方法。
imageList是我自定義的圖片集合
ArrayList<ImageView> imageList;
imageList = new ArrayList<ImageView>();
		for (int i = 0; i < ads.length; i++) {
			// 初始化圖片資源
			ImageView image = new ImageView(this);
			image.setBackgroundResource(ads[i]);
			imageList.add(image);
		}

ads是圖片數組
private static int[] ads = { R.drawable.ad1, R.drawable.ad2,R.drawable.ad3, R.drawable.ad4, R.drawable.ad5, R.drawable.ad6 };
這裏需要注意的是,我們舉例子的圖片是六張,當我們滑動到第六張的時候,就不能往下滑動了,因爲下面沒有圖了。這個時候,如果想要再次滑動跳轉到第一張的時候,我們就要做2個事情。首先是
	@Override
		/**
		 * 獲得頁面的總數
		 */
	public int getCount() {
			return Integer.MAX_VALUE;
	}
這裏設置爲最大個數。
然後在instantiateItem方法裏,我們獲取圖片位置的時候,不使用position,而是用position去取餘,即position % imageList.size()。
至此。我們就基本實現了圖片輪轉,只不過是要手動的去左右滑動。

接下來講如何動態的每個2秒中去跳轉到下一個圖片。
有4種實現方式
 /*
		  * 自動循環:
		  * 1、定時器:Timer
		  * 2、開子線程 while  true 循環
		  * 3、ColckManager 
		  * 4、 用handler 發送延時信息,實現循環
 */

我們這裏用最後一種去試下。

首先定義handler對象

private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			view_pager.setCurrentItem(view_pager.getCurrentItem() + 1);
			if (isRunning) {
				handler.sendEmptyMessageDelayed(0, 2000);
			}
		}

	};
view_pager.setCurrentItem(view_pager.getCurrentItem() + 1);的意思是在handler收取到消息後,先獲取當前位置,然後在移動到下一個位置。
然後兩秒後再次發送handler處理消息。
isRunning是定義的一個布爾值,默認爲假。在onCeate()方法裏,設置爲true,然後去發送handler處理消息。
isRunning = true;
handler.sendEmptyMessageDelayed(0, 2000);
自此,我們就完成了圖片每隔2秒,自動跳轉到下一個頁面了。
有時間再詳細講解一下ViewPager,這裏先簡單用上。


































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