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仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)的更多相关文章

  1. Android 仿百合网超火爆社交app首页滑动效果

    探探,百合网等神器的首页有一个相册加载个控件,通过左滑右滑加载新的照片,同时左滑丢弃这个照片,右滑则表明对这个照片感兴趣. 这个效果是怎么实现的呢? 1,Android3.0以后控件中增加了setTr ...

  2. Android系统的三种分屏显示模式

    Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...

  3. Android仿微信QQ等实现锁屏消息提醒

    demo代码如下: import android.content.Intent; import android.os.Bundle; import android.support.v7.app.App ...

  4. android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码

    Android精选源码 android漂亮的加载效果 android各种 选择器 汇总源码 Android仿bilibili搜索框效果 Android记事本app.分类,涂鸦.添加图片或者其他附件 仿 ...

  5. Android ViewPager实现软件的第一次加载的滑动效果

    public class MainActivity extends Activity { private ViewPager viewPager; private List<View> V ...

  6. 【Android UI】顶部or底部菜单的循环滑动效果一

    实现了分页的滑动效果,做的demo流畅运行 注:貌似支持的样式(控件)有一定的限制,我试过短信的listview页面,暂无法实现滑动效果 java文件:MainActivity.java.Activi ...

  7. Android 仿QQ消息界面

    values 下面 dimens.xml <resources> <!-- Default screen margins, per the Android Design guidel ...

  8. android 仿微信聊天界面,以及语音录制功能

    extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图:     第一:chat.xml设计 ...

  9. Android 仿电商app商品详情页按钮浮动效果

    1.效果图如下: 这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果. 2.分析 为了方便理解,作图分析 如图所示,整个页面分为四个部分: 1.悬浮内容,floatView 2.顶部内容,he ...

随机推荐

  1. webuploader的一个页面多个上传按钮实例

    借鉴一位大佬的demo  附上他的github地址https://github.com/lishuqi 我把他的cxuploader.js改了不需要预览  直接上传图片后拿到回传地址给img标签显示图 ...

  2. VMWARE虚拟机中CentOs7网络连接

    1.选择网络连接模式 这里选择NAT模式 2.查看虚拟机逻辑地址段 编辑---->虚拟网络编辑器 这里显示的是192.168.40.0 我们本机占用了192.168.40.1,网关是192.16 ...

  3. Java核心技术36讲----------谈谈final、finally、finalize有什么不同

    一.final 1.final修饰方法时,需要注意的点: #final修饰方法时,之前的第二个原因是效率.但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升.在最近的Java版本中,不需要使用 ...

  4. CentOS6升级Python2.6到3.7,错误处理[No module named '_ctypes']

    CentOS6升级Python2.6到3.7,错误处理[No module named '_ctypes'] 因开发需要,在CentOS 6 服务器将Python2进行升级到Python3.由于工作中 ...

  5. ruby 爬虫爬取拉钩网职位信息,产生词云报告

    思路:1.获取拉勾网搜索到职位的页数 2.调用接口获取职位id 3.根据职位id访问页面,匹配出关键字 url访问采用unirest,由于拉钩反爬虫,短时间内频繁访问会被限制访问,所以没有采用多线程, ...

  6. Nodejs实战 —— 测试 Node 程序

    读 <node.js实战2.0>,进行学习记录总结. 当当网购买链接 豆瓣网1.0链接 测试 Node 程序 本章内容 用 Node 的 assert 模块测试 使用其他断言库 使用 No ...

  7. 20155335 俞昆 2016-2017-2 《Java程序设计》第九周学习总结

    学号 2016-2017-2 <Java程序设计>第九周学习总结 ##JDBC入门 在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不 ...

  8. 北京Uber优步司机奖励政策(4月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. OpenCV 3.2 Viz 3D可视化

    该可视化模块提供了坐标系变化,3D动画等功能 最简单的显示坐标系 viz::Viz3d window("window"); window.showWidget("Coor ...

  10. 【费元星】crt 无法上传文件,总是显示盾牌表示-完美解决

    将如下内容保存到文件中,已.bat 结尾 taskkill /f /im explorer.exeattrib -s -r -h "%userprofile%\AppData\Local\i ...