Android ViewSwitcher 的功能与用法
ViewSwitcher 代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.
为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可.
下面通过一个实例来介绍 ViewFactory的用法.(仿Android系统Launcher 界面 实现分屏 左右滑动效果)
import java.util.ArrayList; import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewSwitcher;
import android.widget.ViewSwitcher.ViewFactory; public class ViewSwitcherTest extends Activity
{
// 定义一个常量,用于显示每屏显示的应用程序数
public static final int NUMBER_PER_SCREEN = 12; // 代表应用程序的内部类,
public static class DataItem
{
// 应用程序名称
public String dataName;
// 应用程序图标
public Drawable drawable;
} // 保存系统所有应用程序的List集合
private ArrayList<DataItem> items = new ArrayList<DataItem>();
// 记录当前正在显示第几屏的程序
private int screenNo = -1;
// 保存程序所占的总屏数
private int screenCount;
ViewSwitcher switcher;
// 创建LayoutInflater对象
LayoutInflater inflater; @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater = LayoutInflater.from(ViewSwitcherTest.this);
// 创建一个包含40个元素的List集合,用于模拟包含40个应用程序
for (int i = 0; i < 40; i++)
{
String label = "" + i;
Drawable drawable = getResources().getDrawable(
R.drawable.ic_launcher);
DataItem item = new DataItem();
item.dataName = label;
item.drawable = drawable;
items.add(item);
}
// 计算应用程序所占的总屏数。
// 如果应用程序的数量能整除NUMBER_PER_SCREEN,除法的结果就是总屏数。
// 如果不能整除,总屏数应该是除法的结果再加1。
screenCount = items.size() % NUMBER_PER_SCREEN == 0 ?
items.size()/ NUMBER_PER_SCREEN :
items.size() / NUMBER_PER_SCREEN + 1;
switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
switcher.setFactory(new ViewFactory()
{
// 实际上就是返回一个GridView组件
@Override
public View makeView()
{
// 加载R.layout.slidelistview组件,实际上就是一个GridView组件。
return inflater.inflate(R.layout.slidelistview, null);
}
});
// 页面加载时先显示第一屏。
next(null);
} public void next(View v)
{
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
((GridView) switcher.getNextView()).setAdapter(adapter);
// 点击右边按钮,显示下一屏,也可通过手势检测实现显示下一屏.
switcher.showNext();
}
} public void prev(View v)
{
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
((GridView) switcher.getNextView()).setAdapter(adapter);
// 点击左边按钮,显示上一屏,也可通过手势检测实现显示上一屏.
switcher.showPrevious();
}
} // 该BaseAdapter负责为每屏显示的GridView提供列表项
private BaseAdapter adapter = new BaseAdapter()
{
@Override
public int getCount()
{
// 如果已经到了最后一屏,且应用程序的数量不能整除NUMBER_PER_SCREEN
if (screenNo == screenCount - 1
&& items.size() % NUMBER_PER_SCREEN != 0)
{
// 最后一屏显示的程序数为应用程序的数量对NUMBER_PER_SCREEN求余
return items.size() % NUMBER_PER_SCREEN;
}
// 否则每屏显示的程序数量为NUMBER_PER_SCREEN
return NUMBER_PER_SCREEN;
} @Override
public DataItem getItem(int position)
{
// 根据screenNo计算第position个列表项的数据
return items.get(screenNo * NUMBER_PER_SCREEN + position);
} @Override
public long getItemId(int position)
{
return position;
} @Override
public View getView(int position
, View convertView, ViewGroup parent)
{
View view = convertView;
if (convertView == null)
{
// 加载R.layout.labelicon布局文件
view = inflater.inflate(R.layout.labelicon, null);
}
// 获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
ImageView imageView = (ImageView)
view.findViewById(R.id.imageview);
imageView.setImageDrawable(getItem(position).drawable);
// 获取R.layout.labelicon布局文件中的TextView组件,并为之设置文本
TextView textView = (TextView)
view.findViewById(R.id.textview);
textView.setText(getItem(position).dataName);
return view;
}
};
}
slide_in_right.xml
<?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>
slide_out_left.xml
<?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>
labelicon.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个垂直的LinearLayout,该容器中放置一个ImageView和一个TextView -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
/>
</LinearLayout>
main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- 定义一个ViewSwitcher组件 -->
<ViewSwitcher
android:id="@+id/viewSwitcher"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<!-- 定义滚动到上一屏的按钮 -->
<Button
android:id="@+id/button_prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="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_alignParentRight="true"
android:onClick="next"
android:text=">" />
</RelativeLayout>
slidelistview.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:numColumns="4"
android:layout_height="match_parent"> </GridView>
Android ViewSwitcher 的功能与用法的更多相关文章
- ViewSwitcher的功能与用法
ViewSwtcher代表了视图切换组件,它本身继承了FrameLayout,因此可以将多个View层叠在一起,每次只显示一个组件.当程序控制从一个View切换到另一个View时,ViewSwitch ...
- Android选项卡TabHost功能和用法
1.布局文件 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Android 自学之画廊视图(Gallery)功能和用法
Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框.他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显 ...
- android中Handle类的用法
android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...
- 搜索框(SearchView)的功能与用法
SearchView是搜索框组件,它可以让用户在文本框内输入汉字,并允许通过监听器监控用户输入,当用户用户输入完成后提交搜索按钮时,也通过监听器执行实际的搜索. 使用SearchView时可以使用如下 ...
- 数值选择器(NumberPicker)的功能与用法
数值选择器用于让用户输入数值,用户既可以通过键盘输入数值,也可以通过拖动来选择数值.使用该组件常用如下三个方法. setMinValue(int minVal):设置该组件支持的最小值. setMax ...
- 日历视图(CalendarView)组件的功能和用法
日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触摸来滚动日历.如果希望监控该组件的日历改变,可调用CalendarView的setOnDateChangeLi ...
- 星级评分条(RatingBar)的功能和用法
星级评分条与拖动条有相同的父类:AbsSeekBar,因此它们十分相似.实际上星级评分条与拖动条的用法.功能都十分接近:它们都是允许用户通过拖动条来改变进度.RatingBar与SeekBar最大区别 ...
- 拖动条(SeekBar)的功能和用法
拖动条和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程序,而拖动条则通过滑块的位置来标识数值——而且拖动条允许用户拖动滑块来改变值,因而拖动条通常用于对系统的某种数值进行调节,比如调节音量等 ...
随机推荐
- js基础语法之函数
普通函数 function foo(a, b){ return a + b; } foo(10, 20) >>> 30 匿名函数 var f = function(){console ...
- rest-framework频率组件
throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...
- 优化MySQL性能的几种方法-总结
原文:http://bbs.landingbj.com/t-0-245601-1.html 1.要选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越 小,在它上 ...
- 对于vue和react“页面间”传递数据的理解误区
前言 如果我们想要实现多个标签页之间的通信,可以使用localStorage.cookie等,但是能不能用vue或react呢? 结论 答案是NO,因为vue和react虽然可以在“多个”页面之间传递 ...
- Laravel认证模块开发
菜鸟学Laravel(二) Laravel认证模块开发 laravel内部已经做好了一个简单的登录模块,我们可以用如下命令来生成: 1 php artisan make:auth 我们查看一下路由 ...
- Client将数据读写HDFS流程
HDFS介绍 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的. 什么是分布式文件系统 分布式文件系统(Dist ...
- java学习之—排序
package test3; public class Sort{ /** * 冒泡排序 * @param array */ public void bubbleSort(int[] array) { ...
- NFS配置与搭建
参考: Linux下NFS服务器的搭建与配置 https://www.cnblogs.com/liuyisai/p/5992511.html http://blog.51cto.com/hongten ...
- C#中is运算符
is运算符可以检查对象是否与特定的类型兼容.“兼容”表示对象或者该类型,或者派生自该类型.例如,要检查变量是否与object类型兼容,可以使用下面的代码: int i=10; if(i is ob ...
- SQL约束(主键约束、外键约束、自动递增、不允许空值、值唯一、值默认、值限制范围)
NOT NULL 不允许空值约束 NOT NULL 约束强制列不接受 NULL 值(NULL值就是没有值或缺值).NOT NULL 约束强制字段始终包含值,即不向字段添加值,就无法插入新记录或者更新记 ...