当前位置: 首页 > 编程日记 > 正文

Creating Apps With Material Design —— Defining Custom Animations

转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android,时间仓促,有翻译问题请留言指出。谢谢


定义动画

在材料设计动画让用户与您的应用程序进行交互时,为他们的行为提供反馈。并提供可视化的连续性。

该材料的主题提供了一些默认的动画button和活动过渡,而Android5.0(API等级21)以上,您能够自己定义这些动画和创建新的:


    触摸反馈 
    通告显示 
    活动转变 
    曲线运动 
    视图状态更改 

自己定义触摸反馈


触摸反馈在材料设计提供了一种瞬时视觉确认在接触点上,当用户与用户界面元素进行交互。默认的触摸反馈的动画button,使用新的RippleDrawable类来实现不同状态之间的转换与产生连锁反应动画。



在大多数情况下,你应该通过指定视图背景。在视图中的XML应用此功能:


    ?android:attr/selectableItemBackground for a bounded ripple?

android:attr/selectableItemBackgroundBorderless for a ripple that extends beyond the view


或者,你能够定义一个RippleDrawable为使用波纹元素的XML资源。 

您能够指定一种颜色RippleDrawable对象。要更改默认的触摸反馈的颜色,使用的主题的android:colorControlHighlight属性。


使用Reveal Effect


Reveal动画为用户提供视觉的连续性,当您显示或隐藏一组UI元素。该ViewAnimationUtils.createCircularReveal()方法。您能够设置动画clipping circle来显示或隐藏视图。



要使用此效果显示先前不可见的view:

// previously invisible view
View myView = findViewById(R.id.my_view);// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;// get the final radius for the clipping circle
int finalRadius = myView.getWidth();// create and start the animator for this view
// (the start radius is zero)
Animator anim =ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
anim.start();

要使用此效果隐藏先前看到的view:

// previously visible view
final View myView = findViewById(R.id.my_view);// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;// get the initial radius for the clipping circle
int initialRadius = myView.getWidth();// create the animation (the final radius is zero)
Animator anim =ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0);// make the view invisible when the animation is done
anim.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);myView.setVisibility(View.INVISIBLE);}
});// start the animation
anim.start();


自己定义Activity transitions


在材料设计应用程序的Activity通过运动来进行不同状态之间的转换。

您能够指定自己定义动画的进入和退出的过渡和Activity之间共享内容的转换。 

Android5.0(API级别21)支持这些进入和退出的转换: 

    爆炸 - 从现场的中心移动的view。 
    幻灯片 - 移动视图或从场景的边缘。 
    褪色 - 通过改变其透明度加入或删除场景视图。 

transition扩展了能见度类的不论什么变化都支持作为进入或退出转型。欲了解很多其它信息,请參阅该转换类的API參考。 

Android5.0(API级别21)也支持这些共同的元素转换: 

    changeBounds - 动画处理目标View布局界限。


    changeClipBounds - 动画处理目标View区域剪辑。


    changeTransform - 动画处理目标View缩放和旋转。 
    changeImageTransform - 动画处理改变目标图像的大小和比例。 

当您在应用程启用Activity转变时,默认以交叉渐变过渡的进入和退出Activity的启动。



指定自己定义的转换


首先。当你定义一个风格,继承了材料的主题属性使窗体内容转换 Android:windowContentTransitions。您也能够指定进入。退出,并指定您定义的样式共享元素的转换:

<style name="BaseAppTheme" parent="android:Theme.Material"><!-- enable window content transitions --><item name="android:windowContentTransitions">true</item><!-- specify enter and exit transitions --><item name="android:windowEnterTransition">@transition/explode</item><item name="android:windowExitTransition">@transition/explode</item><!-- specify shared element transitions --><item name="android:windowSharedElementEnterTransition">@transition/change_image_transform</item><item name="android:windowSharedElementExitTransition">@transition/change_image_transform</item>
</style>

在这个样例中。change_image_transform过渡的定义例如以下:

<!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"><changeImageTransform/>
</transitionSet>

该changeImageTransform元素相应于ChangeImageTransform类。欲了解很多其它信息,请參阅转换的API參考。 

为确保窗体移动动画实现,须要调用Window.requestFeature()方法:

// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);// set an exit transition
getWindow().setExitTransition(new Explode());

要指定你的代码转换,调用这些方法与Transition对象: 

    Window.setEnterTransition() 
    Window.setExitTransition() 
    Window.setSharedElementEnterTransition() 
    Window.setSharedElementExitTransition() 

该setExitTransition()和setSharedElementExitTransition()方法定义为调用活动的退出过渡。

该setEnterTransition()和setSharedElementEnterTransition()方法定义了称为活动的输入过渡。



为了得到一个过渡的完整效果。您必须启用这两个主叫和被叫的活动窗体中的内容转换。否则。调用活动将启动退出过渡,但随后你会看到一个窗体的过渡(如规模或褪色)。 

開始尽快的进入过渡,使用Window.setAllowEnterTransitionOverlap()方法被调用的Activity。这让你有很多其它戏剧性的进入过渡动画。 


使用转换開始活动


假设启用转换并设置为Activity的退出过渡,当您启动还有一个Activity时。例如以下的转变被激活:

startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

假设您设置了进入转型的第二个活动,过渡也是该活动開始时激活。

要禁用转换,当你開始还有一项活动,提供了一个null的选项。



实现一个共同的元素之间的屏幕过渡动画


    让你的主题窗体的内容转换。 
    指定你的风格的共享元素的过渡。 
    定义转换为XML资源。 
    指定一个共同的名字在两个布局与Android的共享元素:transitionName属性。


    使用ActivityOptions.makeSceneTransitionAnimation()方法。

// get the element that receives the click event
final View imgContainerView = findViewById(R.id.img_container);// get the common element for the transition in this activity
final View androidRobotView = findViewById(R.id.image_small);// define a click listener
imgContainerView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(this, Activity2.class);// create the transition animation - the images in the layouts// of both activities are defined with android:transitionName="robot"ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, androidRobotView, "robot");// start the new activitystartActivity(intent, options.toBundle());}
});

对于您的代码生成共享动态视图。使用View.setTransitionName()方法在两个Activity中指定一个共同的元素名称。 

为了扭转场景过渡动画,当你完毕了第二个活动,叫Activity.finishAfterTransition()方法。而不是Activity.finish()。


启动有多个共享的元素的Activity


为了使两项活动有多个共享的元素,定义了两种布局方式与Android的共享元素之间的场景过渡动画:transitionName属性(或使用View.setTransitionName()在这两个活动的方法),并创建一个ActivityOptions对象例如以下:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(view1, "agreedName1"),Pair.create(view2, "agreedName2"));

使用Curves Motion

在材料设计的动画依赖于曲线插补时间和空间上的运动模式。

採用Android5.0(API等级21)以上,则能够定义自己定义定时曲线和曲线运动模式的动画。 

该PathInterpolator类是基于贝塞尔曲线或路径对象上的新插值。该插补指定一个1x1正方形的运动曲线。用(0,0)定位点和(1,1)和控制点使用构造函数的參数指定。

您也能够定义一个路径插补为XML资源:

<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"android:controlX1="0.4"android:controlY1="0"android:controlX2="1"android:controlY2="1"/>

该系统提供的XML资源中的材料设计规范的三个基本曲线: 

    @interpolator/fast_out_linear_in.xml@interpolator/fast_out_slow_in.xml@interpolator/linear_out_slow_in.xml


你能够通过一个PathInterpolator对象的Animator.setInterpolator()方法。



该ObjectAnimator类有新的构造函数。使您能够同一时候使用两种或两种以上的属性,在一次路径动画坐标。比如,以下的动画师使用Path对象进行动画视图的x和y属性:

ObjectAnimator mAnimator;
mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
...
mAnimator.start();

视图动画状态改变


该StateListAnimator类能够定义动画执行时的视图状态发生改变。

以下的演示样例演示怎样为XML资源定义一个StateListAnimator:

<!-- animate the translationZ property of a view when pressed -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><set><objectAnimator android:propertyName="translationZ"android:duration="@android:integer/config_shortAnimTime"android:valueTo="2dp"android:valueType="floatType"/><!-- you could have other objectAnimator elementshere for "x" and "y", or other properties --></set></item><item android:state_enabled="true"android:state_pressed="false"android:state_focused="true"><set><objectAnimator android:propertyName="translationZ"android:duration="100"android:valueTo="0"android:valueType="floatType"/></set></item>
</selector>

要高度自己定义的视图状态动画视图,定义使用XML资源文件里选择元素在这个样例中的动画,并将其分配给您的视图与Android:stateListAnimator属性。在代码分配一个状态表动画到一个视图中,使用AnimationInflater.loadStateListAnimator()方法,以及动画分配给你的View与View.setStateListAnimator()方法。 

当你的主题扩展了材料的主题,button都为Z动画默认。为了避免你的button此问题,设置了android:stateListAnimator属性来@null。



该AnimatedStateListDrawable类用于创建,显示相关的视图状态更改的动画可绘。

默认情况下,一些安卓5.0系统部件的使用这些动画。以下的演示样例演示怎样为XML资源定义一个AnimatedStateListDrawable:

<!-- res/drawable/myanimstatedrawable.xml -->
<animated-selectorxmlns:android="http://schemas.android.com/apk/res/android"><!-- provide a different drawable for each state--><item android:id="@+id/pressed" android:drawable="@drawable/drawableP"android:state_pressed="true"/><item android:id="@+id/focused" android:drawable="@drawable/drawableF"android:state_focused="true"/><item android:id="@id/default"android:drawable="@drawable/drawableD"/><!-- specify a transition --><transition android:fromId="@+id/default" android:toId="@+id/pressed"><animation-list><item android:duration="15" android:drawable="@drawable/dt1"/><item android:duration="15" android:drawable="@drawable/dt2"/>...</animation-list></transition>...
</animated-selector>


Animate Vector Drawables


矢量可绘制具有可扩展性又不失清晰。该AnimatedVectorDrawable类,您能够设置动画的矢量绘制的属性。



你通常在三个XML文件里定义动画矢量可绘制对象: 

    A vector drawable with the <vector> element in res/drawable/An animated vector drawable with the <animated-vector> element in res/drawable/One or more object animators with the <objectAnimator> element in res/anim/


矢量动画可绘制对象能够动画的<group>的属性和<path>元素。 <group>元素定义了一组路径或小组,并在<path>元素定义要绘制的路径。



当你定义你想要的动画矢量绘制,使用android:name属性为唯一的名称分配给组和路径。这样你就能够把它们从你的动画定义。比如:

<!-- res/drawable/vectordrawable.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"android:height="64dp"android:width="64dp"android:viewportHeight="600"android:viewportWidth="600"><groupandroid:name="rotationGroup"android:pivotX="300.0"android:pivotY="300.0"android:rotation="45.0" ><pathandroid:name="v"android:fillColor="#000000"android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /></group>
</vector>

动画绘制矢量的定义是指通过他们的名字矢量绘制的组和路径:

<!-- res/drawable/animvectordrawable.xml -->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/vectordrawable" ><targetandroid:name="rotationGroup"android:animation="@anim/rotation" /><targetandroid:name="v"android:animation="@anim/path_morph" />
</animated-vector>

动画的定义代表ObjectAnimator或AnimatorSet对象。在这个样例中,第一动画旋转目标组360度:

<!-- res/anim/rotation.xml -->
<objectAnimatorandroid:duration="6000"android:propertyName="rotation"android:valueFrom="0"android:valueTo="360" />

在本实施例中的第二动画摇身一变载体可拉伸的路径从一个形状到还有一种。

两个路径必须是变形兼容:它们必须具有同样数目的命令和每一个命令的參数的数量同样。


<!-- res/anim/path_morph.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"><objectAnimatorandroid:duration="3000"android:propertyName="pathData"android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"android:valueType="pathType" />
</set>

ps:path画画,编写更复杂的路径,需要使用SVG编辑

转载于:https://www.cnblogs.com/gcczhongduan/p/4844891.html

相关文章:

怎么剪切一段音乐其中的片段

剪切音乐想必大家都不陌生&#xff0c;在各种手机铃声中我们都需要用到它来制作个性有趣的来电铃声&#xff0c;那么大家知道有什么简便的方法使用吗&#xff1f;小编有一个办法就是利用剪切工具的功能就可以完成了&#xff0c;我们就不用不用一点一点的设置音频片段了&#xf…

无需重启, 使用Xephyr调试awesome

每次改了awesome总是心里忐忑的重新启动awesome 稍有不慎就会导致awesome加载失败 而使用默认配置加载. 对于改了一大堆快捷键绑定的人来说, 默认配置简直没法用了... 有时候还会直接起不来...需要用到killall awesome才能退回到lightdm的登录界面偶然发现xephyr这个工具 可以虚…

java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)

作为 Java 程序员而言&#xff0c;先不考虑自己系统外部依赖的缓存、消息队列、数据库等等东西挂掉&#xff0c;就我们自己系统本身而言&#xff0c;最常见的挂掉的原因是什么&#xff1f;其实就是系统OOM&#xff0c;也就是所谓的内存溢出&#xff01;什么是内存溢出&#xff…

java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

http://langgufu.iteye.com/blog/2107023 java处理大文件&#xff0c;一般用BufferedReader,BufferedInputStream这类带缓冲的Io类&#xff0c;不过如果文件超大的话&#xff0c;更快的方式是采用MappedByteBuffer。 MappedByteBuffer是java nio引入的文件内存映射方案&#xf…

HTML5 Canvas编写五彩连珠(3):设计

在看了几篇Canvas相关的文章后&#xff0c;发现前两节的代码实现还是有问题&#xff0c;因为知道的少&#xff0c;所以只能在自己已知的知识上做实现。不过还好&#xff0c;这是一个发现的过程&#xff0c;也是一个纠错和完善的过程。我第一次尝试一边学习一遍写博客&#xff0…

SQL面试宝典一:

1.什么是sql Injection&#xff08;sql 注入&#xff09;&#xff1f;如何防止&#xff1f; 答&#xff1a;是一种恶意将sql代码添加到输入参数中&#xff0c;传递到sql服务器解析并执行的一种攻击手法。 防止&#xff1a;1.对用户的输入进行校验&#xff0c;可以通过正则表达…

java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口

前言Spring的Order注解或者Ordered接口大家都知道是控制顺序的&#xff0c;那么它们到底是控制什么顺序的&#xff1f;是控制Bean的注入顺序&#xff0c;还是Bean的实例化顺序&#xff0c;还是Bean的执行顺序呢&#xff1f;那么我们先直接给出结论再来验证结论。结论&#xff1…

数据驱动安全需三大核心新技术

要做到数据驱动安全&#xff0c;齐向东认为需要三大核心技术。第一个核心技术是大数据采集器&#xff0c;第二个是大数据引擎&#xff0c;第三个是机器学习挖掘、重要安全问题定位准确。转载于:https://www.cnblogs.com/1992825-Amelia/p/4854220.html

[转]BI 问答

http://blog.bridata.ca/?cat16 前几天Post 了一些BI 的面试问题&#xff0c;感兴趣的人很多&#xff0c;有很多人问我答案以此来评估一下自己的知识水平。坦白地说我没有写在纸上的具体答案&#xff0c;事实上每个问题也没有具体和精确的答案&#xff0c;所谓面试就不是笔试&…

没有学不会的C++:用户自定义的隐式类型转换

C 中的类型转换包含内建类型的转换和用户自定义类型的转换&#xff0c;而这两者都又可分为隐式转换和显示转换&#xff0c;所以一共有如下四象限表格中的 A、B、C、D 四种情况 隐式转换显示转换(casting)内建类型转换 (int, float ...)AB用户自定义类型转换(类 vs 类; 类 vs 内…

python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

安装ScrapyScrapy是一个高级的Python爬虫框架&#xff0c;它不仅包含了爬虫的特性&#xff0c;还可以方便的将爬虫数据保存到csv、json等文件中。首先我们安装Scrapy。pip install scrapy在Windows上安装时可能会出现错误&#xff0c;提示找不到Microsoft Visual C。这时候我们…

执行eclipse,迅速failed to create the java virtual machine。

它们必须在一排&#xff0c;否则会出现The Eclipse executable launcher was unable to locate its companion shared library的错误 打开eclipse文件夹下的eclipse.ini文件。改动–launcher.XXMaxPermSize属性&#xff0c;当中此属性有两处 -startup plugins/org.eclipse.equi…

vue打包后图片找不到情况

打包之前需要修改如下配置文件&#xff1a; 配置文件一&#xff1a;build>>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件&#xff08;图片路径失效&#xff09;的问题) 配置文件二&#xff1a;config>>>index.js(修改a…

UBUNTU安装SSH和xrdp

一、安装SSH&#xff0c;通过PUTTY访问 命令&#xff1a;sudo apt-get install ssh 查看&#xff1a;netstat -l 二、安装xrdp&#xff0c;通过远程桌面访问 命令&#xff1a;sudo apt-get install xrdp 开启远程桌面访问权限 系统-->首选项-->remote desktop 三、去掉远…

python中opencv中inrange用法_python-opencv中的cv2.inRange函数

本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间&#xff0c;颜色去除白色背景部分具体就调用了cv2的两个函数&#xff0c;一个是rgb转hsv的函数具体用法hsv cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)然后利用cv2.inRange函数设阈值&#xff0c;去除背景部分mask cv2…

[转]C++11 随机数学习

相对于C 11之前的随机数生成器来说&#xff0c;C11的随机数生成器是复杂了很多。这是因为相对于之前的只需srand、rand这两函数即可获取随机数来说&#xff0c;C11提供了太多的选择和东西。 随机数生成算法&#xff1a; 随机数生成算法有很多&#xff0c;C11之前的C/C只…

Linux Shell ssh登录脚本

Linux 登陆服务器敲命令太多,某时候确实不便,所以就用shell写了一个 我的blog地址: http://www.cnblogs.com/caoguo 一.说明 支持秘密和密钥两种格式用户名和密码都是写文件的,明文保存二.配置 密码文件配置:序号:IP:端口:用户:密码:说明 1:192.168.88.128:22:root:toor:虚拟机…

C# 温故而知新:Stream篇(二)

C# 温故而知新&#xff1a;Stream篇&#xff08;二&#xff09; TextReader 和StreamReader 目录&#xff1a; 为什么要介绍 TextReader&#xff1f; TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简单介绍下Encoding 编码 StreamReader 的定义及作用 S…

usaco Pollutant Control

第一问是求最小割。第二问求最小割中集合中边最少的集合的大小。 第三问求集合中边最少且字典序最小的边的下标。 第一问直接求最大流就能解&#xff0c;第二问将原来的边的容量都改为1&#xff0c;求出来的最大流就是元素最少的一个最小割的大小。 将容量都改为1之后&#xff…

洛谷P4705 玩游戏(生成函数+多项式运算)

题面 传送门 题解 妈呀这辣鸡题目调了我整整三天……最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误……玄学到了我\(WA\)的点全都是\(WA\)在\(2\)的幂次行里…… 看到这种题目二话不说先推倒 \[ \begin{aligned}…

blast程序 介绍 简介

每次找都挺麻烦&#xff0c;又记不住&#xff0c;于是抄下来&#xff1a; blastp:将待查询的蛋白质序列及其互补序列一起对蛋白质序列数据库进行查询&#xff1b;blastn:将待查询的核酸序列及其互补序列一起对核酸序列数据库进行查询&#xff1b;blastx:先将待查询的核酸序列按…

java泛型的实现和原理_java 泛型实现原理

泛型思想最早在C语言的模板(Templates)中产生&#xff0c;Java后来也借用了这种思想。虽然思想一致&#xff0c;但是他们存在着本质性的不同。C中的模板是真正意义上的泛型&#xff0c;在编译时就将不同模板类型参数编译成对应不同的目标代码&#xff0c;List和List是两种不同的…

java out of range_关于Parameter index out of range求解决办法

程序&#xff1a;提示参数越界&#xff0c;但我实在不知道我到底哪里越界了。明明该我那样写的嘛。求高手帮我看看&#xff0c;现在我是弄得我有气无力了&#xff01;要死了。在去死亡的路上等着你帮帮我&#xff01;Document : replyokCreated on : 2008-9-29, 6:05:31Autho…

FineReport——权限分配以及自定义首页

权限分配可以有两种方法&#xff0c;第一种方法是根据部门职位分配权限&#xff0c;第二种是根据角色分配权限&#xff1b; FR自带有三个JQ对象&#xff0c;用以保存用户名参数/角色参数/部门参数——$fr_username/$fr_authority/$fr_userposition 根据部门职位&#xff1a; 以…

去掉[]中的英文(正则表达式)C#

这个问题本来是以为信息科技大学的老师问蒋委员长的问题,蒋委员长用正则表达式完成了这个问题 1,问题的情况有哪些? abc[abc]abc,abc[-abc]abc,abc[一abc]abc,abc[一abc一]abc等等. 2,问题的解决目标? 写一个通用的方法来完成提出的问题. 3,解决方案 -->正则表达式方法 其…

Event Loop

事件队列 Javascript是单线程&#xff0c;单线程就意味着所有任务需要排队。然后会将所有任务分成两类&#xff1a;同步任务和异步任务&#xff01;同步任务&#xff1a;在主线程上执行的任务&#xff0c;只有前一个任务执行完成&#xff0c;才会执行后一个&#xff01;异步任务…

java makefile jar包_java makefile学习实践(编译的javac命令写在makefile中,运行命令java写在shell脚本中)...

学习makefile教程&#xff0c;ubuntu中文网1.写一个简单的java项目&#xff0c;不需要外部jar,用的简单的importjava.util.ArrayList;是可以从CLASSPATH环境变量中找到的&#xff0c;在javac阶段不需要特殊添加-cphellocatHellocat.javaimportjava.util.ArrayList;importjava.u…

Python字符编码详解

Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的字符编码的特点&#xff0c;并介绍了在python2.x中如何与编码问题作战 &#xff1a;&#xff09; 请注意本文关于Python的内容仅适用于2.x&a…

《编写有效用例》读书笔记1

第一章 引言 本章主要介绍用例是什么样子的&#xff0c;并描述为什么不同的项目组需要采用不同 的用例编写风格以及在什么地方使用用例有利于做需求收集工作&#xff0c;也让我们了解 在编写用例之前&#xff0c;需要做哪些准备工作。 用例是代表系统中各个项目相关人员之间就系…

顺序结构,判断结构 if,switch

1&#xff1a;顺序结构&#xff1a;从上往下执行程序代码&#xff0c;为顺序结构 ---------------------------------------------------------------------- 2&#xff1a;判断结构&#xff1a; if 如果 判断是两个选择一个&#xff0c;要么对要么错 if中的条件表达式 返回…