通过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>

右滑动画

viewSwitcher 切换视图的更多相关文章

  1. vuejs切换视图同时保持状态

    vuejs切换视图同时保持状态 http://cn.vuejs.org/guide/components.html#动态组件 动态组件 多个组件可以使用同一个挂载点,然后动态地在它们之间切换.使用保留 ...

  2. iOS开发:使用Tab Bar切换视图

    iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...

  3. Android技术——切换视图(两)随着ViewPage达到Tab幻灯片浏览

    Android技术--切换视图(一)~(四)在资源项目:https://github.com/YongYuIT/MeiNv_Liulanqi 一.早期android(android.support.v ...

  4. angular学习笔记(十七)-路由和切换视图

    本篇介绍angular中如何通过判断url的hash值来显示不同的视图模板,并使用不同的控制器: 下面,通过一个例子,来一步一步说明它的用法: 我们要做一个邮箱应用,打开的时候显示的是邮件列表: 然后 ...

  5. iOS:切换视图时,反向传递数据方法二:代理

    代理: 1.发送信息的控制器设置一个代理,并自定义一个代理的方法,用来传递数据 2.接受信息的控制器遵循发送信息的控制器的协议 3.接受信息的控制器设置发送信息的控制器的代理为自己self 4.接受信 ...

  6. iOS:切换视图时,反向传递数据方法一:通知

    通知方式: 1.有一个(单例)通知中心,负责管理iOS中的所有通知 2.需要获取某种通知,必须注册成为观察者(订阅) 3.不再需要取某种通知时,要取消注册. 4.你可以向通知中心发送某种通知,通知中心 ...

  7. 九、UINavigationController切换视图 实例

    现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Application 命名 NavigationCo ...

  8. MMDrawerController第三方库的使用(根据导航item+滚动条progressView实现的手势滑动切换视图的)

    https://github.com/mutualmobile/MMDrawerController MMDrawerControlleris边抽屉导航容器视图控制器用来支持越来越多的应用程序利用抽屉 ...

  9. UINavigationController切换视图的简单使用

    UINavigationController通过栈的方式来管理视图,通过push将视图压入栈,pop将视图推出栈. 下面通过简单的示例说明 AppDelegate.m - (BOOL)applicat ...

随机推荐

  1. InvenSense 美国公司

    InvenSense为智能型运动处理方案的先驱.全球业界的领导厂商,驱动了运动感测人机接口在消费性电子产品上的应用.公司提供的集成电路(IC)整合了运动传感器-陀螺仪以及相对应的软件,有别于其他厂商, ...

  2. python3.7内置函数整理笔记

    #python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整数或浮点数. 如果参数是复数,则返回其大小 # print(abs(1)) # print(abs(-1)) # ...

  3. machine learning (5)---learning rate

    degugging:make sure gradient descent is working correctly cost function(J(θ)) of Number of iteration ...

  4. 关于Serializable

    1.在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化. 2.通过ObjectOutputStream和ObjectInputStream对对象进行序列化 ...

  5. bug的编写技巧与级别划分

    一.bug编写技巧 确.清晰.简洁.完整.一致 二.bug包含的要素 缺陷ID.缺陷标题.测试环境.缺陷发现日期时间.缺陷提交人 缺陷优先级.缺陷严重等级.发现缺陷软件版本.测试类型 缺陷复现步骤.期 ...

  6. Java - 框架之 SpringBoot 攻略day01

          Spring-Boot 攻略 day01 spring-boot   一. 基本配置加运行   1. 导入配置文件(pom.xml 文件中)   <parent> <gr ...

  7. Java - 框架之 Struts2

    一. Package 标签 1. 标签属性:name        : 包的名称,只有在一个项目中不重名即可.extends       : 继承哪个包,默认为 struts-default.name ...

  8. 集合(Collection)类

    集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. ...

  9. django 第四天模板渲染

    今日内容 一.模板渲染 语法 {{ 变量 }} {% 逻辑 %} 1.变量 取列表中的第几个元素,用索引 <p>{{ namelist.2 }}</p> 取字典中的第几个元素用 ...

  10. 洛谷 P2827 蚯蚓 题解

    每日一题 day32 打卡 Analysis 我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部 ...