ViewSwitcher常用于两个视图带动画效果的切换,如果试图里面只是图片也可以使用ImageSwitcher,前面有介绍,本文模拟手机上屏幕菜单,将应用分屏显示和切换的功能,并实现滑屏动画,部分内容来源网络,这里将其完善和优化:

SlideMenuActivity:

package com.home.testviewswitcher;import java.util.ArrayList;import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;import com.home.testviewswitcher.MenuData.DataItem;public class SlideMenuActivity extends Activity implements OnGestureListener {private SlideMenuSwitcher switcher;private GestureDetector detecter;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);switcher = new SlideMenuSwitcher(this);setContentView(switcher);detecter = new GestureDetector(this, this);switcher.setData(makeItems());}/*** 添加初始应用程序* * @return*/private ArrayList<DataItem> makeItems() {ArrayList<DataItem> items = new ArrayList<DataItem>();for (int i = 1; i < 54; i++) {String label = "App" + i;Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);DataItem item = new DataItem();item.dataName = label;item.drawable = drawable;items.add(item);}return items;}@Overridepublic boolean onTouchEvent(MotionEvent event) {return detecter.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent arg0) {return false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float arg2,float arg3) {float instance = e1.getX() - e2.getX();if (instance > 10) {switcher.showNextScreen();} else if (instance < 10) {switcher.showPreviousScreen();}return false;}@Overridepublic void onLongPress(MotionEvent arg0) {}@Overridepublic boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {return false;}@Overridepublic void onShowPress(MotionEvent arg0) {}@Overridepublic boolean onSingleTapUp(MotionEvent arg0) {return false;}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {detecter.onTouchEvent(ev);return super.dispatchTouchEvent(ev);}}

SlideMenuSwitcher:

package com.home.testviewswitcher;import java.util.ArrayList;import android.content.Context;
import android.view.View;
import android.widget.GridView;
import android.widget.ViewSwitcher;
import com.home.testviewswitcher.MenuData.DataItem;/*** 自定义ViewSwitcher,实现分屏和切换* * @author Administrator* */
public class SlideMenuSwitcher extends ViewSwitcher {private MenuData mMenuData;private int mCurrentScreen;// 当前屏索引private Context mContext;public SlideMenuSwitcher(Context context) {super(context);mContext = context;setFactory(new SlideViewFactory());}/*** 设置数据,并将初屏显示出来* * @param dataItems*/public void setData(ArrayList<DataItem> dataItems) {mMenuData = new MenuData();mMenuData.setMenuItems(dataItems);// 设置当前要显示的屏的索引mCurrentScreen = mMenuData.getScreenNumber() / 2;GridView listView = (GridView) getCurrentView();OneScreenListAdapter adapter = new OneScreenListAdapter(mContext);adapter.setScreenData(mMenuData.getScreen(mCurrentScreen));listView.setAdapter(adapter);}/*** 显示下一屏*/public void showNextScreen() {if (mCurrentScreen < mMenuData.getScreenNumber() - 1) {mCurrentScreen++;setInAnimation(mContext, R.anim.push_left_in);setOutAnimation(mContext, R.anim.push_left_out);} else {return;}setViewData(mCurrentScreen);showNext();}/*** 显示上一屏*/public void showPreviousScreen() {if (mCurrentScreen > 0) {mCurrentScreen--;setInAnimation(mContext, R.anim.push_right_in);setOutAnimation(mContext, R.anim.push_right_out);} else {return;}setViewData(mCurrentScreen);showPrevious();}/*** 为GridView设置数据并刷新* * @param index*/private void setViewData(int index) {GridView gridView = (GridView) getNextView();OneScreenListAdapter adapter = new OneScreenListAdapter(mContext);adapter.setScreenData(mMenuData.getScreen(index));gridView.setAdapter(adapter);}/*** 工厂,构造GridView为ViewSwitcher的内容* * @author Administrator* */class SlideViewFactory implements ViewFactory {public View makeView() {GridView gridView = new GridView(mContext);gridView.setNumColumns(3);gridView.setVerticalSpacing(20);gridView.setHorizontalSpacing(20);return gridView;}}
}

OneScreenListAdapter:

package com.home.testviewswitcher;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.home.testviewswitcher.MenuData.MenuDataOneScreen;public class OneScreenListAdapter extends BaseAdapter {private MenuDataOneScreen mScreen;private LayoutInflater mInflater;public OneScreenListAdapter(Context context) {mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public void setScreenData(MenuDataOneScreen screenData) {mScreen = screenData;}public int getCount() {return mScreen.mDataItems.size();}public Object getItem(int position) {return mScreen.mDataItems.get(position);}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {View view = convertView;if (convertView == null) {view = mInflater.inflate(R.layout.gridview_grid, null);}ImageView imageView = (ImageView) view.findViewById(R.id.imageview);TextView textView = (TextView) view.findViewById(R.id.textview);imageView.setImageDrawable(mScreen.mDataItems.get(position).drawable);textView.setText(mScreen.mDataItems.get(position).dataName);return view;}}

MenuData:

package com.home.testviewswitcher;import java.util.ArrayList;import android.graphics.drawable.Drawable;/*** 该类模拟了功能菜单的数据部分* * @author Administrator* */
public class MenuData {/** 每一屏能够容纳的应用程序数目 */public static final int NUMBER_IN_ONE_SCREEN = 12;/** 所有屏的集合 */public ArrayList<MenuDataOneScreen> mScreens = new ArrayList<MenuDataOneScreen>();/** 该类代表每个应用程序的数据部分 */public static class DataItem {public String dataName; // 应用程序名称public Drawable drawable; // 应用程序图标}/** 该类代表了一个屏的所有应用程序 */public static class MenuDataOneScreen {ArrayList<DataItem> mDataItems = new ArrayList<DataItem>();}/*** 对该类进行赋予数据* * @param dataItems*/public void setMenuItems(ArrayList<DataItem> dataItems) {// 获取屏数int screenNum = dataItems.size() / NUMBER_IN_ONE_SCREEN;int remain = dataItems.size() % NUMBER_IN_ONE_SCREEN;screenNum += remain == 0 ? 0 : 1;// 为每屏设置数据int pos = 0;for (int i = 0; i < screenNum; i++) {MenuDataOneScreen screen = new MenuDataOneScreen();for (int j = 0; j < NUMBER_IN_ONE_SCREEN; j++) {if (pos <= dataItems.size() - 1) {screen.mDataItems.add(dataItems.get(pos));pos++;}}mScreens.add(screen);}}/*** 获取屏数* * @return*/public int getScreenNumber() {return mScreens.size();}/*** 根据屏的索引,获取某个屏的数据* * @param screenIndex* @return*/public MenuDataOneScreen getScreen(int screenIndex) {return mScreens.get(screenIndex);}
}

这里使用的动画和前面自定义一个ImageSwitcher使用的动画一样,就不再给出。

gridview_grid.xml:(每个GridView里面的布局):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imageview"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/textview"android:layout_below="@id/imageview"android:layout_alignLeft="@id/imageview"android:layout_width="wrap_content"android:layout_height="wrap_content" /></RelativeLayout>

使用ViewSwitcher模拟手机屏幕应用分屏和切换相关推荐

  1. 华为手机怎么使用分屏_这是一份华为手机必备小技巧使用说明

    一天24小时,手机占用了我们大部分的时间,高效地使用手机,可以节约出大量时间.随着华为手机全新EMUI9.1的推出,手机功能也越来越人性化,我们再次喜迎一波实用又便捷的玩机小技巧!精挑细选十二个绝妙技 ...

  2. 手机屏幕如何投屏到电脑上(Windows10)

    手机屏幕如何投屏到电脑上(Windows10) 进入电脑设置-显示界面 选择投影到此电脑 添加"无线显示器"到可选功能 安装后需要重启使用. 我的手机是三星的,启动电脑连接应用,打 ...

  3. 手机屏幕如何投屏到电脑显示器上?

    能手机作为科技的产物,给我们的生活带来了很多便捷,吃饭.购物包括其他的很多东西都可以用手机实现支付.只要有网我们就可以随时随地的看视频,可是有的时候用手机看视频时间长了会很累,那么有什么办法能解决这个 ...

  4. 小米android n 分屏,小米官方确认这几款手机都支持分屏功能

    原标题:小米官方确认这几款手机都支持分屏功能 [手机中国 新闻]随着MIUI 9的发布,让很多小米手机用户欣喜若狂.有些遗憾的是,本以为分屏功能会是标配,可即便是升级了MIUI 9,也只有部分机型能够 ...

  5. 单片机模拟手机屏幕亮度调节功能

    概括: 通过运用AD/DA转换芯片来输出电压控制LED灯的亮度,实现在较暗环境下LED灯亮度偏弱,在较亮环境下LED灯亮度偏强的效果.用到的核心模块为XPT2046芯片,通过PWM波的调控来实现上述效 ...

  6. adb 获取手机屏幕内容 截屏录制视频

    adb 获取手机屏幕内容 截屏录制视频 官方文档 安装 屏幕截图获取 连接设备到adb,使用命令查看:·adb devices adb shell screencap /sdcard/screen.p ...

  7. 小米android n 分屏,官方确认!这些小米手机都支持分屏

    ­ 本以为分屏在MIUI9上会成为标配功能,但目前最新的消息显示,即便是升级了MIUI9,也只有部分机型能够支持分屏. ­ 日前,小米在MIUI官方论坛发布公告称,MIUI9的分屏功能只支持只支持基于 ...

  8. 手机屏幕失灵,触屏失灵,屏幕划不动急救2

    手机屏幕失灵,触屏失灵,屏幕划不动急救 droidVNC-NG vnc viewer AnLink 最近发现几个软件,配合下就能完美实现电脑控制手机,需要的到官网找下 前两个配合就能用,第三个体验会更 ...

  9. vivo分屏_不当学习机的照相机不是好手机:vivo分屏+Jovi助手,学习无压力

    当下正值特殊时期,各大组织步入正轨的时间都尚未确定,因此不少学校和企业都已经转移至"线上办公". 可是对于"学习黄金期"的学生而言,学习显然不是一件很有吸引力的 ...

最新文章

  1. Ajax Upload多文件上传插件翻译及中文演示
  2. android闹钟例子,自己软件中调用android系统闹钟
  3. 全球及中国潜水压力传感器行业运行态势及发展战略研究报告2022-2027年
  4. 第2课第3节_Java面向对象编程_继承性_P【学习笔记】
  5. php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...
  6. 哈希表的画法_智慧树知到_机械制图A_答案新版
  7. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决
  8. 装修要找大品牌还是游击队,还是包工头?
  9. bouncing-balls-evil-circle
  10. 汉诺塔c 语言程序代码,汉诺塔 (C语言代码)
  11. 基于FPGA的可控倒计时计数器
  12. windows 快捷键关闭屏幕
  13. 如何为您的Android手机创建自定义铃声
  14. 浪潮服务器开机没有信号输出,PLC输出指示灯已经点亮但是输出没有信号-工业支持中心-西门子中国...
  15. opencv 稀疏光流 稠密光流
  16. 微信小程序-注册成为小程序开发者
  17. 300G,某小屁孩乐疯了
  18. Python |浅谈爬虫的由来
  19. ipv6一致性(packet too big)测试
  20. [Ubuntu20.04] 没有eth0只有lo和wlo1(没有网卡驱动)

热门文章

  1. 让世界没有陌生的角落共享单车时代的快与慢
  2. 自适应滤波:维纳滤波器——FIR及IIR设计
  3. CHIL-SQL-FOREIGN KEY 约束
  4. .net mvc web api 返回 json 内容,过滤值为null的属性
  5. A CAPTCHA Server Control for ASP.NET C# 版
  6. 你需要明白的SQL SERVER书签查找(Bookmark Lookup)
  7. Java学习笔记——面向对象 1
  8. 【MySQL】【翻译】 基于GTID追踪的自适应路由查询
  9. 关于垃圾回收,我来解释下为什么LocalConnection可以实现垃圾回收
  10. 软件设计师考试笔记:UML统一建模语言