ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.
为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可.
下面通过一个实例来介绍 ViewSwitcher的用法.(仿Android系统Launcher 界面 实现分屏 左右滑动效果)
第一步,新建项目,打开activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.viewswitchdemo.MainActivity" >
<ViewSwitcher
android:id="@+id/viewSwitcher"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ViewSwitcher>
<!-- 定义滚动到上一屏的按钮 -->
<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="P" />
<!-- 定义滚动到下一屏的按钮 -->
<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="L" />
</RelativeLayout>
在这个布局中,创建了一个ViewSwitcher,表示这里是可变的View,还有一个往前和往后的按钮
2,新建slidelistview.xml, 这个视图就表示ViewSwitcher中变化的View
<?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>
3,新建item.xml,表示gridView的子视图
<?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>
4,打开MainActivity.java
public class MainActivity extends Activity {
//每一屛显示的应用数
public static final int NUMBER_PRE_SCREEN=12;
//应用程序的内部类
public static class DataItem{
//应用名字
public String dataName;
//应用程序图片
public Drawable drawable;
}
//保存系统应用的集合
private List<DataItem> items=new ArrayList<MainActivity.DataItem>();
//记录当前正是显示的第几屏应用
private int screenNo=-1;
//程序所占的总屏数
private int screenCount;
ViewSwitcher switcher;
LayoutInflater inflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inflater=LayoutInflater.from(this);
//模拟40个应用程序
for (int i = 0; i < 40; i++) {
String label=""+i;
Drawable draw=getResources().getDrawable(R.drawable.ic_launcher);
DataItem item=new DataItem();
item.dataName=label;
item.drawable=draw;
items.add(item);
}
// 计算应用程序所占的总屏数。
// 如果应用程序的数量能整除NUMBER_PER_SCREEN,除法的结果就是总屏数。
// 如果不能整除,总屏数应该是除法的结果再加1。
screenCount = items.size() % NUMBER_PRE_SCREEN == 0 ?
items.size()/ NUMBER_PRE_SCREEN :
items.size() / NUMBER_PRE_SCREEN + 1;
switcher=(ViewSwitcher) findViewById(R.id.viewSwitcher);
switcher.setFactory(new ViewFactory() {
@Override
public View makeView() {
return inflater.inflate(R.layout.slidelistview,null);
}
});
next(null);
Button b1=(Button) findViewById(R.id.button_next);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
next(null);
}
});
Button b2=(Button) findViewById(R.id.button_prev);
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
pre(null);
}
});
}
public void next(View v){
if(screenNo<screenCount-1){
screenNo++;
switcher.setInAnimation(this,android.R.anim.slide_in_left);
switcher.setOutAnimation(this,android.R.anim.slide_out_right);
GridView gv=(GridView) switcher.getNextView();
gv.setAdapter(adapter);
switcher.showNext();
}
}
public void pre(View v){
if(screenNo>0){
screenNo--;
switcher.setInAnimation(this,android.R.anim.slide_in_left);
switcher.setOutAnimation(this,android.R.anim.slide_out_right);
GridView gv=(GridView) switcher.getNextView();
gv.setAdapter(adapter);
switcher.showPrevious();
}
}
private BaseAdapter adapter =new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
View view = convertView;
if (convertView == null)
{
// 加载R.layout.labelicon布局文件
view = inflater.inflate(R.layout.item, null);
}
// 获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
ImageView imageView = (ImageView)
view.findViewById(R.id.imageview);
DataItem it=(DataItem) getItem(position);
imageView.setImageDrawable(it.drawable);
// 获取R.layout.labelicon布局文件中的TextView组件,并为之设置文本
TextView textView = (TextView)
view.findViewById(R.id.textview);
textView.setText(it.dataName);
return view;
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public Object getItem(int position) {
return items.get(screenNo * NUMBER_PRE_SCREEN + position);
}
@Override
public int getCount() {
// 如果已经到了最后一屏,且应用程序的数量不能整除NUMBER_PER_SCREEN
if (screenNo == screenCount - 1
&& items.size() % NUMBER_PRE_SCREEN != 0)
{
// 最后一屏显示的程序数为应用程序的数量对NUMBER_PER_SCREEN求余
return items.size() % NUMBER_PRE_SCREEN;
}
// 否则每屏显示的程序数量为NUMBER_PER_SCREEN
return NUMBER_PRE_SCREEN;
}
};
}
- Android 仿百合网超火爆社交app首页滑动效果
探探,百合网等神器的首页有一个相册加载个控件,通过左滑右滑加载新的照片,同时左滑丢弃这个照片,右滑则表明对这个照片感兴趣. 这个效果是怎么实现的呢? 1,Android3.0以后控件中增加了setTr ...
- Android系统的三种分屏显示模式
Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...
- Android仿微信QQ等实现锁屏消息提醒
demo代码如下: import android.content.Intent; import android.os.Bundle; import android.support.v7.app.App ...
- android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码
Android精选源码 android漂亮的加载效果 android各种 选择器 汇总源码 Android仿bilibili搜索框效果 Android记事本app.分类,涂鸦.添加图片或者其他附件 仿 ...
- Android ViewPager实现软件的第一次加载的滑动效果
public class MainActivity extends Activity { private ViewPager viewPager; private List<View> V ...
- 【Android UI】顶部or底部菜单的循环滑动效果一
实现了分页的滑动效果,做的demo流畅运行 注:貌似支持的样式(控件)有一定的限制,我试过短信的listview页面,暂无法实现滑动效果 java文件:MainActivity.java.Activi ...
- Android 仿QQ消息界面
values 下面 dimens.xml <resources> <!-- Default screen margins, per the Android Design guidel ...
- android 仿微信聊天界面,以及语音录制功能
extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 ...
- Android 仿电商app商品详情页按钮浮动效果
1.效果图如下: 这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果. 2.分析 为了方便理解,作图分析 如图所示,整个页面分为四个部分: 1.悬浮内容,floatView 2.顶部内容,he ...
随机推荐
- Python支付接口汇总大全(包含微信、支付宝等)
微信接口 wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而来,v3.37下载地址 weixin_pay- 是一个简单的微信支付的接口 weixin_pay- 微信支付接口(V3.3. ...
- 『Python基础-1 』 编程语言Python的基础背景知识
#『Python基础-1 』 编程语言Python的基础背景知识 目录: 1.编程语言 1.1 什么是编程语言 1.2 编程语言的种类 1.3 常见的编程语言 1.4 编译型语言和解释型语言的对比 2 ...
- flash读写学习笔记与spi接口及简单测试验证(三)
FPGA中的视频图像资源,以及想要永久存储的程序都是要存储在flash中,flash是FPGA一个不可缺少的部分,flash的种类有很多,根据winbond公司的128Mbit Qual SPI接口的 ...
- vue相关ajax库的使用
相关库: vue-resource: vue插件, 多用于vue1.x axios: 第三方库, 多用于vue2.x vue-resource使用 // 引入模块 import VueResource ...
- BZOJ1066_蜥蜴_KEY
题目传送门 经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了. 由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量. 建图: 1.建超级源和超级汇,设超级源连到每只蜥 ...
- 成都Uber优步司机奖励政策(3月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Qt 学习之路 2
Qt 学习之路 2 | DevBean Tech World Qt 学习之路 2 Qt 学习之路 2 目录
- 每天看一片代码系列(二):WebSocket-Node
简介 我们都知道,websocket主要是通过在浏览器和服务端建立长连接,继而实现二者的相互数据通信.不同于HTTP的轮询,它不会有大量无效的HTTP消息交换,从而节省了花销.websocket其实就 ...
- mysql 题目练习
1 新建一个测试数据库: create database test1 charset utf8; 2 进入数据库 use test1; 3 新建一个sql 文件 ,将下面内容复制进sql 文件 /* ...
- linux (rm指令) 及误删除解决
今天在群里看见这一幕: 看到这儿,我们学习一下 这个RM指令 rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件 ...