1. 程式人生 > >Android開發之自定義控制元件--ViewPager

Android開發之自定義控制元件--ViewPager

package com.itheima18.viewpager;

import java.util.ArrayList;
import java.util.Timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private ViewPager viewPager;
	private TextView title;
	private int[] imageIds;
	private ArrayList images;
	private String[] titles;
	private ArrayList dots;
	private MyPagerAdapter adapter;

	private int oldPosition = 0;// 上一次圓點的位置
	private ScheduledExecutorService scheduledExecutor;

	private int currentIndex = 0; // 當前頁面的位置

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initData();
		initView();
	}

	// 準備初始化資料
	private void initData() {

		// 圖片
		imageIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
				R.drawable.d, R.drawable.e };
		// 用來顯示的圖片
		images = new ArrayList();
		for (int i = 0; i < imageIds.length; i++) {

			ImageView imageView = new ImageView(getApplicationContext());
			imageView.setImageResource(imageIds[i]);

			images.add(imageView);
		}

		// 文字
		titles = new String[] { "鞏俐不低俗,我就不能低俗", "撲樹又回來啦!再唱經典老歌引萬人大合唱",
				"揭祕北京電影如何升級", "樂視網TV版大派送", "熱血屌絲的反殺" };

		// 圓點
		dots = new ArrayList();
		dots.add(findViewById(R.id.dot_0));
		dots.add(findViewById(R.id.dot_1));
		dots.add(findViewById(R.id.dot_2));
		dots.add(findViewById(R.id.dot_3));
		dots.add(findViewById(R.id.dot_4));
	}

	private void initView() {
		viewPager = (ViewPager) findViewById(R.id.viewPager);
		title = (TextView) findViewById(R.id.title);

		title.setText(titles[0]);

		adapter = new MyPagerAdapter();
		viewPager.setAdapter(adapter);

		viewPager.setOnPageChangeListener(new MyOnPageChangeListener());
	}

	private class MyOnPageChangeListener implements OnPageChangeListener {

		@Override
		public void onPageScrollStateChanged(int arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onPageSelected(int position) {
			// 記錄當前頁面
			currentIndex = position;
			// 文字更新
			title.setText(titles[position % images.size()]);
			// 圓點更新
			// 更新當前頁面為白色的圓點
			dots.get(position % images.size()).setBackgroundResource(
					R.drawable.dot_focused);
			// 更新上一個頁面為灰色的圓點
			dots.get(oldPosition % images.size()).setBackgroundResource(
					R.drawable.dot_normal);
			// 更新上一個頁面的位置
			oldPosition = position;
		}

	}

	private class MyPagerAdapter extends PagerAdapter {

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

		// 判斷當前頁面顯示的資料 與 新頁面的資料是否相同
		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0 == arg1;
		}

		// 初始化資料
		@Override
		public Object instantiateItem(ViewGroup viewPager, int position) {
			// TODO Auto-generated method stub
			// viewPager.addView(images.get(position));
			viewPager.addView(images.get(position % images.size()));
			return images.get(position % images.size());
		}

		// 銷燬資料
		@Override
		public void destroyItem(ViewGroup viewPager, int position, Object object) {
			// TODO Auto-generated method stub
			// super.destroyItem(container, position, object);

			viewPager.removeView(images.get(position % images.size()));
		}
	}

	@Override
	protected void onStart() {
		super.onStart();
		// 啟動切換圖片
		scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
		scheduledExecutor.scheduleAtFixedRate(new MyPagerTask(), 2, 2,
				TimeUnit.SECONDS);
	}

	// 切換圖片任務類
	private class MyPagerTask implements Runnable {

		@Override
		public void run() {
			// 切換頁面
			// currentIndex = (currentIndex + 1) % images.size();
			currentIndex++;
			// viewPager.setCurrentItem(item);//設定當前頁面
			// 更新UI Handler
			handler.sendEmptyMessage(0);

		}
	}

	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// super.handleMessage(msg);
			// 切換viewPager當前頁面
			viewPager.setCurrentItem(currentIndex);
		}
	};

	@Override
	protected void onStop() {
		super.onStop();
		// 停止切換圖片
		scheduledExecutor.shutdown();
	}

}

相關推薦

Android開發定義控制元件--ViewPager

package com.itheima18.viewpager; import java.util.ArrayList; import java.util.Timer; import java.util.concurrent.Executors; import java.util.concurrent.Sc

Android 開發定義控制元件開發-01

最近一直在忙於公司的專案,因為要去現場測試正式使用,專案不大但是經手了三個人,到我這裡只能去填坑了,不說這個了,說一下今天得主題,自定義控制元件之基本圖形繪製。 我們平時畫圖需要兩種工具:紙和筆。在Android中 Paint 就是畫筆,而Canvas類就是紙,在這裡叫做畫布。 所以

Android 開發定義控制元件開發-02

1.畫筆的基本設定 : 1.setColor() 該函式的作用是設定畫筆顏色,完整的函式宣告如下: void setColor(int color) 我們知道,一種顏色是由紅、綠、藍三色合成出來的,所以引數 color 只能取8位的0xAARRGGBB樣式顏色值。 其中:

Android開發定義控制元件(一)---onMeasure詳解

         話說一個有十年的程式設計經驗的老漢,決定改行書法,在一個熱火炎炎的中午,老漢拿著毛筆,在一張白紙上寫了個“Hello World!”,從此開啟了他的書法旅程。那麼問題來了請問自定義一個控制元件需要怎樣的流程?我們經常說自定義控制元件,那麼究竟怎樣去自定義一

Android軟體開發 定義控制元件

Android軟體開發之 自定義控制元件 雖然Android系統提供了各種各樣的控制元件供我們開發使用,但在實際的開發中,系統提供的控制元件有時候不能滿足我們的需求,這時我們就需要自定義一個控制元件。 下面的例子就來自定義一個簡單的Button: 首先是佈局,image_btn.xml: <?xml

Android開發筆記定義控制元件(物流時間軸的實現)

最近修改專案遇到檢視物流這個需求,經過一個下午的時間的終於搞定,趁著這個時間點,趕快把這個功能抽取出來,方便大家以後開發的需要,幫助到更多的人 先看效果圖,如下 看完之後,分析可知道,主要是兩部分,一個頭部和一個body. 那我們最主要的工作就是bod

android開發定義TextView設定字間距以及通過TextView控制元件屬性設定行間距

眾所周知,我們的TextView控制元件是沒有設定字間距的屬性滴!為了現實這一夢想,我玩起來了自定義TextView,從而來設定字間距: 自定義TextView設定字間距 第一步:建立自定義TextView: package com.zanel

Android UI高階定義控制元件

在android中有許多控制元件,比如editview、button等,但是,有時這些控制元件並不能滿足我們的需求,這時,我們就需要去自定義一個控制元件來滿足我們的需要,下面給出一個仿360加速球的demo. 1、首先,來看一下360加速球的效果 2、

iOS開發學習-定義控制元件賦值問題--在model的set方法中給控制元件賦值

在自定義控制元件的過程中,剛開始的時候碰到問題是如何給各控制元件動態賦值,最初的想法是把各控制元件屬性放在.h檔案中定義.然後在控制器內獲取資料一一賦值(可行),但是這樣就增加了控制器中的程式碼,比如給定一個場景: collectionViewCell中,有10個控制元件,需要顯示10個數據,這

讓你的app提升一個檔次-Android酷炫定義控制元件

這是我近期整理的比較酷炫並且我們會經常用到的custom view,也有一些不是custom view,但是也是android UI相關的,實現了酷炫UI效果的開源庫,合理利用這些開源庫,可以讓你的app提升一個檔次!總結的專案最後維護時間一般不會超過6個月,會持續更新。部落格可能不能實

一起Talk Android吧(第一百回:Android中使用定義控制元件

各位看官們,大家好,上一回中咱們說的是Android中使用自定義佈局的例子,這一回說的例子是Android中使用自定義控制元件。閒話休提,言歸正轉。讓我們一起Talk Android吧! 看官們,我們在上一回中通過自定義佈局巧妙地實現了分隔線,不過這個分隔線中看

android 8.0 定義控制元件onmesure獲取寬度為0

最近專案需要適配8.0版本,自定義控制元件出現了下面的問題 第一次顯示此彈窗字型出現了偏移,找到原因是textpaint在繪製文字的時候 canvas.drawText(itemText, x + (controlWidth / 2) -textRect.width

Android開發定義可清空內容的EditText

在開發過程中不可避免的總會遇到比如登入註冊、使用者資訊修改等,這時候又是不可避免的會用到EditText控制元件。這個控制元件的使用頻率雖然幾乎類似我們吃飯用“筷子”的頻率,but能不能用出花樣

Android開發定義圓角矩形圖片ImageView

android中的ImageView只能顯示矩形的圖片,這樣一來不能滿足我們其他的需求,比如要顯示圓角矩形的圖片,這個時候,我們就需要自定義ImageView了,其原理就是首先獲取到圖片的Bitmap,然後進行裁剪對應的圓角矩形的bitmap,然後在onDraw()進行繪製

Qt定義控制元件(開關按鈕)

簡述 接觸過iOS系統的童鞋們應該對開關按鈕很熟悉,在設定裡面經常遇到,切換時候的滑動效果比較帥氣。 通常說的開關按鈕,有兩個狀態:on、off。 下面,我們利用自定義控制元件來實現一個開關按鈕。 原理 重寫滑鼠按下事件(mousePres

android開發定義屬性、View和使用

“自定義”這三字聽起來就像是一個高階程式設計師所擁有的一樣!太不接地氣了!come on,baby,讓我們成為高階程式設計師吧!哈哈! 第一步:首先建立一個工程專案,在專案中的res/values/下建立atts.xml檔案,在該檔案中: <?xml version

Android開發定義屬性的使用

自定義屬性一般會在我們自定義一個view的時候會用到,這個其實在系統應用中相當的常見,比如我目前維護的系統launcher應用,裡面就是相當多的自定義view會用到這個自定義屬性設定,那麼現將其總結總結。有些東西不去總結下來,時間久了真的會忘記。 步驟一:

Android開發最新Recyclerview控制元件的使用詳解(一)

    本篇博文主要給大家分享關於RecyclerView控制元件的使用及通過繼承RecyclerView來實現滑動時載入圖片的優化方案,也同樣能解決防止圖片亂序的問題,之前有在網上有看到大神對Android中ListView非同步載入圖片亂序問題進行過分析,並深入剖析原理

WPF/Blend4定義控制元件——製作自己的Button

先展示一下效果圖 先用Ellipse控制元件畫一個30*30的橢圓,找到畫筆屬性Fill,選擇下面的漸變畫筆,左下角選擇徑向漸變,起始顏色設成#FFFF0000,結束顏色設成#FFFFC8C8 右鍵點Ellipse選擇構成控制元件 選擇Button,確定,進入Butt

【我的Android進階旅】定義控制元件使用ViewPager實現可以預覽的畫廊效果,並且定義畫面切換的動畫效果的切換時間

我們來看下效果 在這裡,我們實現的是,一個ViewPager來顯示圖片列表。這裡一個頁面,ViewPage展示了前後的預覽,我們讓預覽頁進行Y軸的壓縮,並設定透明度為0.5f,所有我們看到gif最後,左右兩邊的圖片有點朦朧感。讓預覽頁和主頁面有主從感。我們用分