通过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="&lt;" />
<!-- 定义滚动到下一屏的按钮 -->
<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="&gt;" />
</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>

右滑动画

最新文章

  1. Android开发--apk的生成
  2. 关于iOS构建版本提交iTunes后,一直不出现,没加号的解决方案
  3. java.lang.reflect.Field
  4. json,serialize,msgpack比较
  5. nginx 的源码安装
  6. C编码-1
  7. Android ImageView scaleType属性
  8. 在Heroku上部署MEAN
  9. Raid1源代码分析--开篇总述
  10. C#基础——集合及特殊集合
  11. jquery ajax自定义分页组件(jquery.loehpagerv1.0)原创
  12. Vim-latex 插件 的安装
  13. 树莓派3使用openSUSE Ports 42.3 驱动GPIO注意事项
  14. CentOS 7.4 安装 K8S v1.11.0 集群所遇到的问题
  15. WebService 及 CXF 的进阶讲解
  16. windows安装mysql5.7.xx解压版
  17. 转: chrome64打开弹出窗flash的办法
  18. mybatis-spring 集成
  19. kafka的advertised.host.name参数 外网访问配置
  20. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现分页、过滤

热门文章

  1. 2013.5.3 - KDD第十五天
  2. 2013.5.1 - KDD第十三天
  3. MySQL加锁分析 (转)
  4. 分布式调度平台XXL-JOB源码分析-时序图
  5. 如何防护DDOS攻击策略
  6. Maximal Square II
  7. imagick的简单使用
  8. LibreOJ #528. 「LibreOJ β Round #4」求和
  9. C++ 如何进阶?
  10. 《挑战30天C++入门极限》C++中类的多态与虚函数的使用