在代码中控制UI界面(简单例子)
- 格式:doc
- 大小:52.50 KB
- 文档页数:4
转载:⼀个UI⾃动化的⼩例⼦随便⽤⼀个⼩例⼦来解释⼀下UI⾃动化的开发吧.我先现在有⼀个Button是disable的状态,⼀旦Buttonenable,我们就Click弹出⼀个窗⼝.我们使⽤的测试⼯具就有同步的功能.1.⾃动化⼯具⽣成的程序(发现和操作控件,不能真正运⾏)button=FindButton();ClickButton(button);2.傻⽠的⾃动化程序(通过加⼊sleep变成可以运⾏的程序)button=FindButton();Sleep(10);ClickButton(button);Sleep(10);window=FindWindow();3.简单的⾃动化程序(加⼊同步,使得更可靠和有效率)button=FindButton();WaitButtonEnable(button);ClickButton(button);window=WaitWindowOpen();4.完整的⾃动化程序(保证100%可靠,没有测试程序bug,简单写了⼀下,没有包含exception的控制,时间急,可能也会有错误,不过就是这个意思)Button button=null;for(int i=0;button==null&&i<3;i++) //如果FindButton不稳定,调⽤三次in case{button=FindButton();if(button==null){Log.Error("Tryout{0}:Can not find button",i); //测试⼯具不稳定}else{break;}}if(button==null){Log.Error("Cannot find button. Quit"); //测试⼯具找不到button,或者产品问题Log.Screen();//截图,只是为了⽰例,以后不再单独写return;}if(!WaitButtonEnable(button)){if(button.Enabled==true) //测试⼯具问题,没有得到enable的消息{Log.Error("enabled, but tool didn't detect");}else//测试⼯具问题,不能成功检测button的状态,或者产品问题没有enable{Log.Error("don't enable");return; }}Window window=null;for(i=0;window==null&i<3;i++)//ClickButton不稳定,或者没有得到open event,或者产品问题{ClickButton(button);window=WaitWindowOpen();if(window==null)//没有click或者没有得到消息,或者产品问题{int count=0;findwindow://FindWindow不稳定,重试3次window=FindWindow();if(window!=null) //没有得到消息,但是窗⼝弹出{Log.Error("didn't get event");break;}else //没有click,或者产品问题, 或者FindWindow不稳定{Log.Error("Tryout{0}:didn't get window",i);count++;if(count>3){}else //FindWindow不稳定,workaround{Log.Error("goto{0}",count);goto findwindow;}}}else //成功{break;}}if(window==null){Log.Error("didn't get window, maybe tool or product problem."); return;}。
UI⾃动化之页⾯-上下滑动、左右滑动swipe⽅法操作1.⾸先看app中怎么划分横纵坐标2.swipe函数def swipe(self, start_x, start_y, end_x, end_y, duration=None):"""Swipe from one point to another point, for an optional duration.Args:start_x (int): x-coordinate at which to startstart_y (int): y-coordinate at which to startend_x (int): x-coordinate at which to stopend_y (int): y-coordinate at which to stopduration (:obj:`int`, optional): time to take the swipe, in ms.Usage:driver.swipe(100, 100, 100, 400)Returns:`appium.webdriver.webelement.WebElement`"""# `swipe` is something like press-wait-move_to-release, which the server# will translate into the correct actionaction = TouchAction(self)action \.press(x=start_x, y=start_y) \.wait(ms=duration) \.move_to(x=end_x, y=end_y) \.release()action.perform()return self解析:swipe(self, start_x, start_y, end_x, end_y, duration=None)swipe(开始横坐标,开始纵坐标,结束横坐标,结束纵坐标,持续的时间,单位毫秒)重点:在执⾏swipe之前⼀定要强制sleep 3-4s,不然会出现:wipe did not complete successfully报错3.各种滑动 3.1 因为每个⼿机的坐标可能都不⼀样,这⾥我们可以通过先获取⼿机屏幕的长和宽,然后再次计算需要滑动的坐标位置, def get_myWindow_size(self):'''获取⼿机长宽:return:'''x = self.driver.get_window_size()['width'] # 获取x轴的长度y = self.driver.get_window_size()['height'] # 获取y轴的长度return x,y 3.2 向下滑动,即x轴不变,y轴减⼩def swipeDown(self):'''页⾯向下滑动:return:'''size = self.get_myWindow_size()MyLog.logger().info("size :" +str(size[0])+','+str(size[1]))x1 = int(size[0] * 0.5) # size[0]取元组的第⼀个值,*0.5表⽰中间的点y1 = int(size[1] * 3/4) # size[1]取元组的第⼆个值,*0.1表⽰距离底部近y2 = int(size[1] * 1/6)time.sleep(4)self.driver.swipe(x1, y1, x1, y2, 1000) 3.3 向下滑动,即x轴不变,y轴增⼤def swipeUp(self):'''页⾯向上滑动:return:'''size = self.get_myWindow_size()MyLog.logger().info("size :" +str(size[0])+','+str(size[1]))x1 = int(size[0] * 0.5) # size[0]取元组的第⼀个值,*0.5表⽰中间的点y1 = int(size[1] * 1/6) # size[1]取元组的第⼆个值,*0.1表⽰距离底部近y2 = int(size[1] * 3/4)time.sleep(4)self.driver.swipe(x1, y1, x1, y2, 1000) 3.4 向右滑动,即x减⼩,y轴不变def swipRight(self):'''页⾯向右滑动:return:'''size = self.get_myWindow_size()MyLog.logger().info("size :" +str(size[0])+','+str(size[1]))x1 = int(size[0] * 0.5) # size[0]取元组的第⼀个值,*0.5表⽰中间的点x2 = int(size[0] * 0.25) # size[0]取元组的第⼀个值,*0.5表⽰中间的点y1 = int(size[1] * 3/4) # size[1]取元组的第⼆个值,*0.1表⽰距离底部近y2 = int(size[1] * 1/6)time.sleep(4)self.driver.swipe(x1, y1, x2, y1, 1000) 3.5 向左滑动,即x轴增⼤,y轴不变def swipLeft(self):'''页⾯向左滑动:return:'''。
编写代码通过线性布局实现以下UI界面,该布局总共分为上中下三部分,每一个部分展示的是一本书的详细信息。
效果图如下所示:
任务描述
一.设置整体布局为垂直的线性布局,并设置相关背景颜色(效果图中的参考配色为:#e8
e8e5)
二.完成三个部分的布局嵌套。
其中,每一个部分是一个水平方向的线性布局,并且在里面
继续嵌套2个垂直方向的线性布局。
注意每个部分需要增加适当的间隔(参考效果图)
三.为每个控件设置背景颜色
效果图中的参考配色为:
颜色为:#7ba8b0
颜色为:#bfd9d4
颜色为:#2e4d5c
颜色为:#baccde
颜色为:#7489ab
四.程序运行效果参考提供的页面效果图,文字大小、颜色不做统一要求五 . 将作业项目形成压缩文件并提交。
前言jQuery UI是基于jQuery基础类库API开发的开源的JavaScript 网页UI(用户界面)代码组件库,使用jQuery UI可以实现Web UI界面交互、动画、特效和可更换主题的可视控件,并且还可以定制Web UI的主题风格。
从而可以应用它轻松地构建出高度可交互的Web 应用程序的UI界面。
随着Web应用的普及及AJAX相关应用的深入,客户端和Web服务器端需要频繁地交互数据,对Web交互的界面也提出了新的要求——简洁、方便、人性化等用户体验度高;同时随着移动设备的普及,客户端的访问设备也逐渐多样化。
如何为不同的客户端设备提供统一的Web应用界面,从而提高开发效率和降低开发成本。
目前比较好的技术实现手段是应用JQuery及JQuery UI系统库相关的技术。
作者根据自身多年的软件开发实践和经验总结,结合多年的IT职业培训的教学和高校软件学院一线的教学工作体验,在本系列文档中通过具体的程序代码示例为读者介绍jQuery UI中典型的应用组件技术。
本文档主要涉及jQuery UIMenu菜单组件技术特性、主要的成员属性和主要的事件及应用示例,如何创建竖形Menu菜单的应用示例、如何创建横向展示菜单的应用示例以及定制菜单组件等方面的内容。
本文目录1.1jQuery UI菜单Menu (3)1.1.1jQuery UI菜单(Menu) (3)1.1.2Menu菜单组件主要的成员属性及应用示例 (4)1.1.3Menu组件中的主要事件及应用示例 (10)1.2创建竖形Menu菜单的应用示例 (13)1.2.1体现菜单的层次结构关系的示例 (13)1.2.2禁用的菜单项目示例 (16)1.2.3定义和改变菜单的宽度示例 (17)1.2.4菜单项目中带有指定图标的菜单示例 (17)1.3创建横向展示菜单的应用示例 (21)1.3.1实现思路 (21)1.3.2最终的代码示例 (21)1.1jQuery UI菜单Menu1.1.1jQuery UI菜单(Menu)1、主要的技术特性jQuery Menu 组件可以应用到任何具有父/子关系的元素并将它们转变为菜单,使用jQuery UI实现多级菜单,不仅功能强大,而且所涉及的HTML标签代码简洁、相关的JS脚本语句也简单,使用方便,并允许设计者根据自己的应用需要改变相关的CSS样式。
在代码中控制UI界⾯(简单例⼦)在代码中控制UI界⾯在Android中,⽀持像Java Swing那样完全通过代码控制UI界⾯。
也就是所有的UI组件都通过new关键字创建出来,然后将这些UI组件添加到布局管理器中,从⽽实现⽤户界⾯。
在代码中控制UI界⾯可以分为以下3个关键步骤。
(1)创建布局管理器,可以是帧布局管理器、表格布局管理器、线性布局管理器和相对布局管理器等,并且设置布局管理器的属性。
例如,为布局管理器设置背景图⽚等。
(2)创建具体的组件,可以是TextView、ImageView、EditText和Button等任何Android 提供的组件,并且设置组件的布局和各种属性。
(3)将创建的具体组件添加到布局管理器中。
下⾯将通过⼀个具体的例⼦来演⽰如何使⽤Java代码控制UI界⾯。
【例】在Eclipse中创建Android项⽬,名称为3.2,完全通过代码实现游戏的进⼊界⾯。
(1)在新创建的项⽬中,打开src/com/mingrisoft⽬录下的MainActivity.java⽂件,然后将默认⽣成的下⾯这⾏代码删除。
setContentView(/doc/574fe36731126edb6f1a1099.html yout.main);(2)在MainActivity的onCreate()⽅法中,创建⼀个帧布局管理器,并为该布局管理器设置背景,关键代码如下:1.FrameLayout frameLayout = new FrameLayout(this); // 创建帧布局管理器2.frameLayout.setBackgroundDrawable(this.getResources().getDrawable(3.R.drawable.background01)); // 设置背景4.setContentView(frameLayout); // 设置在Activity中显⽰frameLayout(3)创建⼀个TextView组件text1,设置其⽂字⼤⼩和颜⾊,并将其添加到布局管理器中,具体代码如下:1.TextView text1 = new TextView(this);2.text1.setText("在代码中控制UI界⾯"); // 设置显⽰的⽂字3.text1.setTextSize(/doc/574fe36731126edb6f1a1099.html PLEX_UNIT_PX, 24); // 设置⽂字⼤⼩,单位为像素4.text1.setTextColor(Color.rgb(1, 1, 1)); // 设置⽂字的颜⾊5.frameLayout.addView(text1); // 将text1添加到布局管理器中(4)声明⼀个TextView组件text2,因为在为该组件添加的事件监听中,要通过代码改变该组件的值,所以需要将其设置为MainActivity的⼀个属性,关键代码如下:1.public TextView text2;(5)实例化text2组件,设置其显⽰⽂字、⽂字⼤⼩、颜⾊和布局,具体代码如下:1.text2 = new TextView(this);2.text2.setText("单击进⼊游戏......"); // 设置显⽰⽂字3.text2.setTextSize(/doc/574fe36731126edb6f1a1099.html PLEX_UNIT_PX, 24); //设置⽂字⼤⼩,单位为像素4.text2.setTextColor(Color.rgb(1, 1, 1)); // 设置⽂字的颜⾊/doc/574fe36731126edb6f1a1099.html youtParams params = new LayoutParams(/doc/574fe36731126edb6f1a1099.html youtParams.WRAP_CONTENT,/doc/574fe36731126edb6f1a1099.html youtParams.WRAP_CONTENT); // 创建保存布局参数的对象8.params.gravity = Gravity.CENTER; // 设置居中显⽰9.text2.setLayoutParams(params); // 设置布局参数注意:在我做这个的时候,上⾯第5,6,7,8⾏的代码编写没有达到预期的效果,主要问题是“单击进⼊游戏......”并没有居屏幕的中间显⽰,经过多次的实验分析,将5,6,7,8⾏改成:5. /doc/574fe36731126edb6f1a1099.html youtParams params=new/doc/574fe36731126edb6f1a1099.html youtParams(6. /doc/574fe36731126edb6f1a1099.html youtParams.WRAP_CONTENT,7. /doc/574fe36731126edb6f1a1099.html youtParams.WRAP_CONTENT);8.params.gravity=Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL;(或params.gravity = Gravity.CENTER;也是可以的)。
cmake ui变量
在CMake中,UI变量通常指用户界面(UI)方面的变量,这些变量用于控制或配置项目的用户界面部分。
在CMake中,你可以使用`set()`命令来定义UI变量。
以下是一个简单的例子:
```cmake
# 定义一个UI变量
set(UI_ENABLED TRUE)
# 在配置文件中使用UI变量
configure_file(config.h.in config.h)
# 在源代码中使用UI变量
if(UI_ENABLED)
message("用户界面已启用")
else()
message("用户界面未启用")
endif()
```
上述例子中,`UI_ENABLED`是一个UI变量,用于控制是否启用用户界面。
通过`configure_file`命令,可以将这个变量的值写入配置文件`config.h.in`中,然后在源代码中引用生成的`config.h`文件。
请注意,UI变量的使用方式可能取决于具体的项目结构和需求。
在CMake中,变量的定义和使用可以灵活调整,具体取决于项目的设计。
Shell脚本中的GUI界面设计和交互技巧Shell脚本是一种在Unix操作系统中使用的脚本语言,用于自动化任务和编写系统管理脚本。
虽然Shell脚本通常以命令行的形式运行,但通过添加图形用户界面(GUI)可以提供更好的用户体验和可视化效果。
本文将介绍Shell脚本中的GUI界面设计和交互技巧。
一、使用dialog命令创建GUI界面Dialog是一个在Shell脚本中创建对话框的工具,它提供了一些常见的GUI元素,如文本框、标签、按钮等。
通过使用dialog命令,我们可以在Shell脚本中轻松地创建一个基本的GUI界面。
下面是一个示例代码,演示如何使用dialog命令创建一个简单的GUI界面:```#!/bin/bashdialog --msgbox "欢迎使用Shell脚本GUI界面!" 10 30```上述代码使用dialog命令创建一个消息框,显示一个欢迎消息。
其中,`--msgbox`参数指定对话框类型为消息框,后面的文本是要显示的消息内容,`10`表示对话框的高度,`30`表示宽度。
二、添加用户输入和按钮除了简单的消息框,我们还可以在GUI界面中添加用户输入和按钮,以实现更复杂的交互。
下面是一个示例代码,演示如何使用dialog命令添加文本框和确认按钮:```#!/bin/bashresult=$(dialog --inputbox "请输入您的姓名:" 10 30 2>&1 >/dev/tty) dialog --yesno "确认使用姓名:$result 吗?" 10 30if [ $? -eq 0 ]; thenecho "您选择了确认按钮"elseecho "您选择了取消按钮"fi```上述代码使用dialog命令创建一个文本框,用户可以在其中输入姓名。
`2>&1 >/dev/tty`用于将用户输入保存到变量`result`中。
android控制ui界面的方法Android中控制UI界面的方法有多种,其中一些常见的方法如下:1. 使用布局文件:在Android中,UI界面通常使用布局文件来实现。
开发者可以使用XML文件来描述UI布局,再将其与代码进行绑定,从而实现UI控制。
在布局文件中可以定义各种UI元素,如TextView、Button、ImageView等,然后通过代码获取这些元素,对其进行操作,比如修改文本、更改颜色、隐藏显示等。
2. 使用View对象:View是Android中所有UI元素的基类,在代码中可以通过View对象来控制UI界面。
例如,可以通过findViewById()方法获取视图对象,然后对其进行操作。
3. 使用Handler:Handler是Android中的消息处理机制,可以用于在UI线程和后台线程之间进行通信。
开发者可以在后台线程中使用Handler向UI线程发送消息,从而控制UI界面。
例如,可以使用Handler来更新UI元素的状态。
4. 使用AsyncTask:AsyncTask是一种轻量级的异步任务处理方式,可以用于在后台线程中执行耗时操作,然后在UI线程中更新UI 界面。
开发者可以在AsyncTask中重写doInBackground()方法来实现后台操作,然后在onPostExecute()方法中更新UI界面。
5. 使用事件监听器:Android中的事件监听器可以用于在UI界面中响应各种事件,如点击、滑动、拖拽等。
开发者可以在代码中定义事件监听器,然后将其绑定到UI元素上,从而对UI界面进行控制。
例如,可以定义一个OnClickListener对象来监听按钮点击事件,然后在onClick()方法中实现对UI界面的控制。
gui开发实例GUI开发实例引言:Graphical User Interface(图形用户界面)简称GUI,是现代软件开发中常用的一种用户界面设计方式。
通过GUI可以让用户通过图形化的界面和用户交互,方便地操作软件和获取所需信息。
本文将介绍一些常见的GUI开发实例,展示GUI的强大功能和应用领域。
一、音乐播放器音乐播放器是一个常见的GUI应用程序。
通过GUI界面,用户可以方便地浏览音乐库、选择喜爱的音乐、调整音量和播放进度等功能。
界面通常包括音乐列表、播放控制按钮、音量调节器和进度条等元素。
用户可以通过点击按钮或拖动进度条来控制音乐的播放。
二、计算器计算器是另一个常见的GUI应用程序。
通过GUI界面,用户可以进行各种数学计算操作,如加减乘除、求平方根、百分比计算等。
界面通常包括数字键盘、运算符按钮和显示屏等元素。
用户可以通过点击按钮来输入数字和运算符,并在显示屏上看到计算结果。
三、图像编辑器图像编辑器是用于编辑和处理图像的GUI应用程序。
通过GUI界面,用户可以打开图像文件、进行剪裁、调整亮度和对比度、添加滤镜效果等操作。
界面通常包括菜单栏、工具栏、画布和调整面板等元素。
用户可以通过选择工具和调整参数来对图像进行编辑。
四、文本编辑器文本编辑器是用于编辑文本文件的GUI应用程序。
通过GUI界面,用户可以打开、新建、保存和编辑文本文件。
界面通常包括菜单栏、工具栏、文本编辑区和状态栏等元素。
用户可以通过键盘输入文字、选择字体和颜色、进行查找和替换等操作。
五、日历应用日历应用是用于管理时间和日程的GUI应用程序。
通过GUI界面,用户可以查看日期、添加和编辑日程安排、设置提醒等功能。
界面通常包括日期选择器、日程列表和提醒设置等元素。
用户可以通过点击日期和按钮来进行操作,并在界面上看到相应的日程信息。
六、文件管理器文件管理器是用于管理文件和文件夹的GUI应用程序。
通过GUI界面,用户可以浏览目录结构、复制、移动和删除文件、创建和重命名文件夹等操作。
在代码中控制UI界面
在Android中,支持像Java Swing那样完全通过代码控制UI界面。
也就是所有的UI组件都通过new关键字创建出来,然后将这些UI组件添加到布局管理器中,从而实现用户界面。
在代码中控制UI界面可以分为以下3个关键步骤。
(1)创建布局管理器,可以是帧布局管理器、表格布局管理器、线性布局管理器和相对布局管理器等,并且设置布局管理器的属性。
例如,为布局管理器设置背景图片等。
(2)创建具体的组件,可以是TextView、ImageView、EditText和Button等任何Android 提供的组件,并且设置组件的布局和各种属性。
(3)将创建的具体组件添加到布局管理器中。
下面将通过一个具体的例子来演示如何使用Java代码控制UI界面。
【例】在Eclipse中创建Android项目,名称为3.2,完全通过代码实现游戏的进入界面。
(1)在新创建的项目中,打开src/com/mingrisoft目录下的MainActivity.java文件,然后将默认生成的下面这行代码删除。
setContentView(yout.main);
(2)在MainActivity的onCreate()方法中,创建一个帧布局管理器,并为该布局管理器设置背景,关键代码如下:
1.FrameLayout frameLayout = new FrameLayout(this); // 创建帧布局管理器
2.frameLayout.setBackgroundDrawable(this.getResources().getDrawable(
3.R.drawable.background01)); // 设置背景
4.setContentView(frameLayout); // 设置在Activity中显示frameLayout
(3)创建一个TextView组件text1,设置其文字大小和颜色,并将其添加到布局管理器中,具体代码如下:
1.TextView text1 = new TextView(this);
2.text1.setText("在代码中控制UI界面"); // 设置显示的文字
3.text1.setTextSize(PLEX_UNIT_PX, 24); // 设置文字大小,单位为
像素
4.text1.setTextColor(Color.rgb(1, 1, 1)); // 设置文字的颜色
5.frameLayout.addView(text1); // 将text1添加到布局管理器中
(4)声明一个TextView组件text2,因为在为该组件添加的事件监听中,要通过代码改变该组件的值,所以需要将其设置为MainActivity的一个属性,关键代码如下:
1.public TextView text2;
(5)实例化text2组件,设置其显示文字、文字大小、颜色和布局,具体代码如下:
1.text2 = new TextView(this);
2.text2.setText("单击进入游戏......"); // 设置显示文字
3.text2.setTextSize(PLEX_UNIT_PX, 24); //设置文字大小,单位为
像素
4.text2.setTextColor(Color.rgb(1, 1, 1)); // 设置文字的颜色
youtParams params = new LayoutParams(
youtParams.WRAP_CONTENT,
youtParams.WRAP_CONTENT); // 创建保存布局参数
的对象
8.params.gravity = Gravity.CENTER; // 设置居中显示
9.text2.setLayoutParams(params); // 设置布局参数
注意:在我做这个的时候,上面第5,6,7,8行的代码编写没有达到预期的效果,主要问题是“单击进入游戏......”并没有居屏幕的中间显示,经过多次的实验分析,将5,6,7,8行改成:
5. youtParams params=new youtParams(
6. youtParams.WRAP_CONTENT,
7. youtParams.WRAP_CONTENT);
8.params.gravity=Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL;
(或params.gravity = Gravity.CENTER;也是可以的)。
便成功达到预期的效果。
说明:在通过setTextSize()方法设置TextView的文字大小时,可以指定使用的单位,在上面的代码中,int型的常量PLEX_UNIT_PX表示单位是像素,如果要设置单位是磅,可以使用常量PLEX_UNIT_PT,这些常量可以在Android 官方提供的API中找到。
(6)为text2组件添加单击事件监听器,并将该组件添加到布局管理器中,具体代码如下:
代码位置:光盘\mr\example\第3章\3.2\src\com\mingrisoft\MainActivity.java
1.text
2.setOnClickListener(new OnClickListener() { // 为text2添加单击事件监听器
2.
3.@Override
4.public void onClick(View v) {
5.new AlertDialog.Builder(MainActivity.this).setTitle("系统提示") // 设置对话
框的标题
6..setMessage("游戏有风险,进入需谨慎,真的要进入吗?") // 设
置对话框的显示内容
7..setPositiveButton("确定", // 为确定按钮添加单击事件
8.new DialogInterface.OnClickListener() {
9.
10.@Override
11.public void onClick(DialogInterface dialog, int which)
{
12.Log.i("3.2", "进入游戏"); // 输出消息日志
13.}
14.}).setNegativeButton("退出", // 为取消按钮添加单击事件
15.new DialogInterface.OnClickListener() {
16.
17.@Override
18.public void onClick(DialogInterface dialog,int which)
{
19.Log.i("3.2", "退出游戏"); // 输出消息日志
20.finish(); // 结束游戏
21.}
22.}).show(); // 显示对话框
23.}
24.});
25.frameLayout.addView(text2); // 将text2添加到布局管理器
中
运行本实例,将显示如图3.2所示的运行结果。
单击文字“单击进入游戏……”,将弹出如图3.3所示的提示对话框。
试一试:根据以上程序,制作一个靠窗体底部居中显示开始链接的游戏开始界面。
提示:通过Java代码将LayoutParams对象的gravity属性设置为Gravity.BOTTOM |
Gravity.CENTER_HORIZONTAL即可。
说明:完全通过代码控制UI界面,虽然该方法比较灵活,但是其开发过程比较烦琐,而且不利于高层次的解耦,因此不推荐采用这种方式控制UI界面。