viewSwitcher 切換視圖

 

 

經過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="&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>
右滑動畫
相關文章
相關標籤/搜索