經過VIewSwitcher切換視圖。這個用到了baseAdapter,仍是不太懂,先記個筆記。android
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 定義一個ViewSwitcher組件 --> <ViewSwitcher android:id="@+id/viewSwitcher" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 定義滾動到上一屏的按鈕 --> <Button android:id="@+id/button_prev" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:onClick="prev" android:text="<" /> <!-- 定義滾動到下一屏的按鈕 --> <Button android:id="@+id/button_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:onClick="next" android:text=">" /> </RelativeLayout>
package com.example.viewswitcher import android.app.Activity import android.os.Bundle import android.view.ViewGroup import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.widget.* // 定義一個常量,用於顯示每屏顯示的應用程序數 const val NUMBER_PER_SCREEN = 12 class MainActivity : Activity() { // 保存系統全部應用程序的List集合 private val items = ArrayList<DataItem>() // 記錄當前正在顯示第幾屏的程序 private var screenNo = -1 // 保存程序所佔的總屏數 private var screenCount: Int = 0 private var switcher: ViewSwitcher? = null // 建立LayoutInflater對象 private var inflater: LayoutInflater? = null // 該BaseAdapter負責爲每屏顯示的GridView提供列表項 private val adapter = object : BaseAdapter() { override fun getCount(): Int { // 若是已經到了最後一屏,且應用程序的數量不能整除NUMBER_PER_SCREEN return if (screenNo == screenCount - 1 && items.size % NUMBER_PER_SCREEN != 0) { // 最後一屏顯示的程序數爲應用程序的數量對NUMBER_PER_SCREEN求餘 items.size % NUMBER_PER_SCREEN } else NUMBER_PER_SCREEN // 不然每屏顯示的程序數量爲NUMBER_PER_SCREEN } override fun getItem(position: Int): DataItem { // 根據screenNo計算第position個列表項的數據 return items[screenNo * NUMBER_PER_SCREEN + position] } override fun getItemId(position: Int): Long { return position.toLong() } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { var view = convertView if (convertView == null) { // 加載R.layout.labelicon佈局文件 view = inflater?.inflate(R.layout.labelicon, null) } // 獲取R.layout.labelicon佈局文件中的ImageView組件,併爲之設置圖標 val imageView = view?.findViewById<ImageView>(R.id.imageview) imageView?.setImageDrawable(getItem(position).drawable) // 獲取R.layout.labelicon佈局文件中的TextView組件,併爲之設置文本 val textView = view!!.findViewById<TextView>(R.id.textview) textView.text = getItem(position).dataName return view } } // 表明應用程序的內部類 class DataItem(var dataName: String?, var drawable: Drawable?) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) inflater = LayoutInflater.from(this@MainActivity) // 建立一個包含40個元素的List集合,用於模擬包含40個應用程序 for (i in 0..39) { val label = "" + i val drawable = resources.getDrawable(R.mipmap.ic_launcher, null) val item = DataItem(label, drawable) items.add(item) } // 計算應用程序所佔的總屏數 // 若是應用程序的數量能整除NUMBER_PER_SCREEN,除法的結果就是總屏數 // 若是不能整除,總屏數應該是除法的結果再加1 screenCount = if (items.size % NUMBER_PER_SCREEN == 0) items.size / NUMBER_PER_SCREEN else items.size / NUMBER_PER_SCREEN + 1 switcher = findViewById(R.id.viewSwitcher) switcher?.setFactory { // 加載R.layout.slidelistview組件,實際上就是一個GridView組件 inflater?.inflate(R.layout.slidelistview, null) } // 頁面加載時先顯示第一屏 next(null) } fun next(v: View?) { if (screenNo < screenCount - 1) { screenNo++ // 爲ViewSwitcher的組件顯示過程設置動畫 switcher?.setInAnimation(this, R.anim.slide_in_right) // 爲ViewSwitcher的組件隱藏過程設置動畫 switcher?.setOutAnimation(this, R.anim.slide_out_left) // 控制下一屏將要顯示的GridView對應的Adapter (switcher?.nextView as GridView).adapter = adapter // 單擊右邊按鈕,顯示下一屏 // 學習手勢檢測後,也可經過手勢檢測實現顯示下一屏 switcher?.showNext() // ① } } fun prev(v: View) { if (screenNo > 0) { screenNo-- // 爲ViewSwitcher的組件顯示過程設置動畫 switcher?.setInAnimation(this, android.R.anim.slide_in_left) // 爲ViewSwitcher的組件隱藏過程設置動畫 switcher?.setOutAnimation(this, android.R.anim.slide_out_right) // 控制下一屏將要顯示的GridView對應的 Adapter (switcher?.nextView as GridView).adapter = adapter // 單擊左邊按鈕,顯示上一屏,固然能夠採用手勢 // 學習手勢檢測後,也可經過手勢檢測實現顯示上一屏 switcher?.showPrevious() // ② } } }
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 設置從左邊拖出去的動畫 android:duration指定動畫持續時間 --> <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="@android:integer/config_mediumAnimTime" /> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 設置從右邊拖進來的動畫 android:duration指定動畫持續時間 --> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime" /> </set>