通过VIewSwitcher切换视图。这个用到了baseAdapter,还是不太懂,先记个笔记。
<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>