• viewSwitcher 切换视图


    通过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>
    右滑动画
  • 相关阅读:
    Celery(异步任务,定时任务,周期任务)
    SQLAlchemy的应用创建
    SQLAlchemy多对多
    SQLAlchemy
    app开发-2
    app开发-3
    app开发-1
    MongoDB-pymongo
    MongoDB-增删改查
    MongoDB-数据类型
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/11519352.html
Copyright © 2020-2023  润新知