MotionLayout 基础教程
阅读说明:
- 本文假设读者已掌握如何使用
ConstraintLayout
。 - 本文是一篇
MotionLayout
基础教程,如您已了解如何使用MotionLayout
,本文可能对您帮助不大。 - 本教程共有两篇文章,这是第一篇,另一篇请点击 这里。
- 建议读者跟随本文一起动手操作,如您现在不方便,建议稍后阅读。
- 本文基于
ConstraintLayout 2.0.0-alpha4
版本编写,建议读者优先使用这一版本。 - 由于
MotionLayout
官方文档不全,有些知识点是根据笔者自己的理解总结的,如有错误,欢迎指正。
添加支持库:
dependencies {...implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha4'
}
复制代码
MotionLayout
最低支持到 Android 4.3(API 18)
,还有就是 MotionLayout
是 ConstraintLayout 2.0
添加的,因此必须确保支持库的版本不低于 2.0
。
简介
MotionLayout
类继承自 ConstraintLayout
类,允许你为各种状态之间的布局设置过渡动画。由于 MotionLayout
继承了 ConstraintLayout
,因此可以直接在 XML
布局文件中使用 MotionLayout
替换 ConstraintLayout
。
MotionLayout
是完全声明式的,你可以完全在 XML
文件中描述一个复杂的过渡动画而 无需任何代码(如果您打算使用代码创建过渡动画,那建议您优先使用属性动画,而不是 MotionLayout
)。
开始使用
由于 MotionLayout
类继承自 ConstraintLayout
类,因此可以在布局中使用 MotionLayout
替换掉 ConstraintLayout
。
MotionLayout
与 ConstraintLayout
不同的是,MotionLayout
需要链接到一个 MotionScene
文件。使用 MotionLayout
的 app:layoutDescription
属性将 MotionLayout
链接到一个 MotionScene
文件。
例:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/scene_01"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
注意!必须为 MotionLayout
布局的所有直接子 View
都设置一个 Id
(允许不为非直接子 View
设置 Id
)。
创建 MotionScene 文件
MotionScene
文件描述了两个场景间的过渡动画,存放在 res/xml
目录下。
要使用 MotionLayout
创建过渡动画,你需要创建两个 layout
布局文件来描述两个不同场景的属性。当从一个场景切换到另一个场景时,MotionLayout
框架会自动检测这两个场景中具有相同 id
的 View
的属性差别,然后针对这些差别属性应用过渡动画(类似于 TransitionManger
)。
MotionLayout
框架支持的标准属性:
android:visibility
android:alpha
android:elevation
android:rotation
android:rotationX
android:rotationY
android:scaleX
android:scaleY
android:translationX
android:translationY
android:translationZ
MationLayout
除了支持上面列出的标准属性外,还支持全部的 ConstraintLayout
属性。
下面来看一个完整的例子,这个例子分为以下 3
步。
第 1
步:创建场景 1
的布局文件:
文件名:
activity_main_scene1.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/motionLayout"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
场景 1
的布局预览如下图所示:
第 2
步:创建场景 2
的布局文件:
文件名:
activity_main_scene2.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/motionLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
场景 2
的布局预览如下图所示:
说明:场景 1
与场景 2
中都有一个 id
值为 image
的 ImageView
,它们的差别是:场景 1
中的 image
是水平垂直居中放置的,而场景 2
中的 image
是水平居中,垂直对齐到父布局顶部的。因此当从场景 1
切换到场景 2
时,MotionLayout
将针对 image
的位置差别自动应用位移过渡动画。
第 3
步:创建 MotionScene
文件:
文件名:
activity_main_motion_scene.xml
,存放在res/xml
目录下
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><Transitionapp:constraintSetStart="@layout/activity_main_scene1"app:constraintSetEnd="@layout/activity_main_scene2"app:duration="1000"><OnClickapp:clickAction="toggle"app:targetId="@id/image" /></Transition></MotionScene>
复制代码
编写完 MotionLayout
文件后就可以直接运行程序了。点击 image
即可进行场景切换。当进行场景切换时,MotionLayout
会自动计算出两个场景之间的差别,然后应用相应的过渡动画。
下面对 MotionLayout
文件进行说明:
如上例所示,MotionScene
文件的根元素是 <MotionScene>
。在 <MotionScene>
元素中使用 <Transition>
子元素来描述一个过渡,使用 <Transition>
元素的 app:constraintSetStart
属性指定起始场景的布局文件,使用 app:constraintSetEnd
指定结束场景的布局文件。在 <Transition>
元素中使用 <OnClick>
或者 <OnSwip>
子元素来描述过渡的触发条件。
<Transition>
元素的属性:
app:constraintSetStart
:设置为起始场景的布局文件Id
。app:constraintSetEnd
:设置为结束场景的布局文件Id
。app:duration
:过渡动画的持续时间。app:motionInterpolator
:过渡动画的插值器。共有以下6
个可选值:linear
:线性easeIn
:缓入easeOut
:缓出easeInOut
:缓入缓出bounce
:弹簧anticipate
:(功能未知,没有找到文档)
app:staggered
:【浮点类型】(功能未知,没有找到文档)
可以在 <Transition>
元素中使用一个 <OnClick>
或者 <OnSwipe>
子元素来描述过渡的触发条件。
<OnClick>
元素的属性:
app:targetId
:【id
值】设置用来触发过渡的那个View
的Id
(例如:@id/image
或@+id/image
)。
提示:
app:targetId
的值的前缀既可以是@+id/
也可以是@id/
,两者都可以。官方示例中使用的是@+id/
。不过,使用@id/
前缀似乎更加符合语义,因为@+id/
前缀在布局中常用来创建一个新的Id
,而@id/
前缀则常用来引用其他的Id
值。为了突出这里引用的是其他的Id
而不是新建了一个Id
,使用@id/
前缀要更加符合语义。
app:clickAction
:设置点击时执行的动作。该属性共有以下5
个可选的值:toggle
:在Start
场景和End
场景之间循环的切换。transitionToEnd
:过渡到End
场景。transitionToStart
:过渡到Start
场景。jumpToEnd
:跳到End
场景(不执行过渡动画)。jumpToStart
:跳到Start
场景(不执行过渡动画)。
<OnSwipe>
元素的属性:
app:touchAnchorId
:【id
值】设置拖动操作要关联到的对象,让触摸操作看起来像是在拖动这个对象的由app:touchAnchorSide
属性指定的那个边。app:touchAnchorSide
:设置触摸操作将会拖动对象的哪一边,共有以下4
个可选值:top
left
right
bottom
app:dragDirection
:设置拖动的方向(注意,只有设置了app:touchAnchorId
属性后该属性才有效)。共有以下4
个可选值:dragUp
:手指从下往上拖动(↑)。dragDown
:手指从上往下拖动(↓)。dragLeft
:手指从右往左拖动(←)。dragRight
:手指从左往右拖动(→)。
app:maxVelocity
:【浮点值】设置动画在拖动时的最大速度(单位:像素每秒px/s
)。app:maxAcceleration
:【浮点值】设置动画在拖动时的最大加速度(单位:像素每二次方秒px/s^2
)。
可以同时设置 <OnClick>
与 <OnSwipe>
,或者都不设置,而是使用代码来触发过渡。
还可以在 <Transition>
元素中设置多个 <OnClick>
,每个 <OnClick>
都可以关联到一个不同的控件上。虽然 <Transition>
元素中也可以设置多个 <OnSwipe>
,但是后面的 <OnSwipe>
会替换掉前面的 <OnSwipe>
,最终使用的是最后一个 <OnSwipe>
。
<OnSwipe>
拖动操作
由于 <OnSwipe>
拖动操作涉及的交互较为复杂,这里单独对它的以下 3
个属性进行说明:
app:touchAnchorId
app:dragDirection
app:touchAnchorSide
首先是 app:touchAnchorId
属性与 app:dragDirection
属性。app:touchAnchorId
属性用于设置拖动操作要关联到的对象;app:dragDirection
属性用于指定拖动方向。
默认情况下,由上往下
拖动时会运行过渡动画,此时 <OnSwipe/>
元素不需要设置任何属性,只要在 <Transition>
中加一个 <OnSwipe/>
标签即可。
例:
<Transition...><OnSwipe/></Transition>
复制代码
但是,如果你要支持 由下往上
(↑)或者 由左往右
(→)或者 由右往左
(←),那么至少应该设置好 app:touchAnchorId
与 app:dragDirection
属性。
app:dragDirection
属性设置的拖动方向与 app:touchAnchorId
属性关联到的对象在 Start
场景和 End
场景中的位置是息息相关的。例如下图 a
中,End
场景中的 Widget
位于 Start
场景中的 Widget
的上方,那么应该设置 app:dragDirection="dragUp"
。再看图 b
中,End
场景中的 Widget
位于 Start
场景中的 Widget
的右边,那么应该设置 app:dragDirection="dragRight"
:
如果 End
场景中的 Widget
相对于 Start
场景中的 Widget
是倾斜的(如下图所示),将会有两个可选的方向,下图中的可选方向是 dragUp
、dragRight
,具体使用哪个方向,由你自己决定。
设置一个正确的拖动方向是非常重要的,否则拖动时,过渡动画将表现不佳。
提示:
MotionLayout
将使用app:touchAnchorId
关联到的对象在app:dragDirection
方向上的拖动进度(progress
)作为整个过渡动画的进度,当关联对象在app:dragDirection
方向上的拖动完成时,也就意味着整个过渡动画完成了。
例:实现拖动效果
删除 <Transition>
元素元素的 <OnClick>
标签,并加入一个 <OnSwipe>
标签,修改后的 MotionScene
文件内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><Transitionapp:constraintSetStart="@layout/activity_main_scene1"app:constraintSetEnd="@layout/activity_main_scene2"app:duration="1000"><!-- 删除 OnClick,加入 OnSwipe --><OnSwipeapp:touchAnchorId="@id/image"app:dragDirection="dragUp"/></Transition></MotionScene>
复制代码
注意:如果将 <OnClick>
和 <OnSwipe>
关联到了同一个控件,或者 <OnSwipe>
关联到的那个控件是可点击的,点击事件将会影响到拖动,你将无法按住控件进行拖动,只能按住控件的外面才能拖动。
例:
在 <Transition>
标签中加入 <OnClick>
,修改后的 MotionScene
文件内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><Transitionapp:constraintSetStart="@layout/activity_main_scene1"app:constraintSetEnd="@layout/activity_main_scene2"app:duration="1000"><OnSwipeapp:touchAnchorId="@id/image"app:dragDirection="dragUp"/><!-- 加入 OnClick --><OnClickapp:targetId="@id/image"app:clickAction="toggle"/></Transition></MotionScene>
复制代码
效果如下所示:
app:touchAnchorSide
属性:
app:touchAnchorSide
属性的功能是 “设置触摸操作将会拖动对象的哪一边”,该属性可用于实现可折叠效果,例如可折叠标题栏。
例:在底部实现一个向上拉的折叠效果。
1. 修改 acticity_main_scene1.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/motionLayout"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><!-- 增加以下代码 --><FrameLayoutandroid:id="@+id/bottomBar"android:layout_width="match_parent"android:layout_height="0dp"android:background="@color/colorPrimary"app:layout_constraintTop_toBottomOf="parent"app:layout_constraintBottom_toBottomOf="parent"><ImageViewandroid:layout_gravity="center"android:src="@mipmap/ic_launcher"android:layout_width="wrap_content"android:layout_height="wrap_content"/></FrameLayout></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
2. 修改 acticity_main_scene2.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/motionLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><!-- 增加以下代码 --><FrameLayoutandroid:id="@+id/bottomBar"android:layout_width="match_parent"android:layout_height="120dp"android:background="@color/colorPrimary"app:layout_constraintBottom_toBottomOf="parent"><ImageViewandroid:layout_gravity="center"android:src="@mipmap/ic_launcher"android:layout_width="wrap_content"android:layout_height="wrap_content"/></FrameLayout></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
3. 修改 MotionScene
文件(文件名:activity_main_motion_scene.xml
)
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><Transitionapp:constraintSetStart="@layout/activity_main_scene1"app:constraintSetEnd="@layout/activity_main_scene2"app:duration="1000"><!-- 关联到 bottomBar 上--><OnSwipeapp:touchAnchorId="@id/bottomBar"app:touchAnchorSide="top"app:dragDirection="dragUp"/><OnClickapp:targetId="@id/image"app:clickAction="toggle"/></Transition></MotionScene>
复制代码
效果如下所示:
提示:其实
<OnSwipe>
可以不关联到bottomBar
上,在因为在前面的例子中我们已经把<OnSwipe>
关联到了image
上,且拖动方向也设置正确(drageUp
),这样其实已经可以正常拖动了。但是由于bottomBar
是可折叠的,把<OnSwipe>
拖动关联到它上面更加合适,这样可以设置app:touchAnchorSide="top"
,告诉MotionLayout
控件bottomBar
的上边界是可拖动的,这样更符合语义。
使用代码触发过渡动画
除了使用 <OnClick>
元素与 <OnSwipe>
元素来设置触发过渡动画的触发条件外,还可以使用代码来手动触发过渡动画。
下面对场景 1
的布局文件进行修改,在布局中添加 2
个按钮,预览如下图所示:
场景 1
修改后的布局文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/motionLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/btnToStartScene"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="16dp"android:text="To Start Scene"android:textAllCaps="false"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@id/btnToEndScene" /><Buttonandroid:id="@+id/btnToEndScene"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="16dp"android:text="To End Scene"android:textAllCaps="false"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toRightOf="@id/btnToStartScene"app:layout_constraintRight_toRightOf="parent" /></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
场景 2
的布局文件不需要修改。
在 MainActivity
中添加如下代码来手动执行过渡动画:
public class MainActivity extends AppCompatActivity {private MotionLayout mMotionLayout;private Button btnToStartScene;private Button btnToEndScene;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_scene1);mMotionLayout = findViewById(R.id.motionLayout);btnToStartScene = findViewById(R.id.btnToStartScene);btnToEndScene = findViewById(R.id.btnToEndScene);btnToStartScene.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 切换到 Start 场景mMotionLayout.transitionToStart();}});btnToEndScene.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 切换到 End 场景mMotionLayout.transitionToEnd();}});}
}
复制代码
如上面代码中所示,调用 MotionLayout
的 transitionToStart()
方法可以切换到 Start
场景,调用 MotionLayout
的 transitionToStart()
方法可以切换到 End
场景。
效果如下所示:
调整过渡动画的进度
MotionLayout
还支持手动调整过渡动画的播放进度。使用 MotionLayout
的 setProgress(float pos)
方法(pos
参数的取值范围为 [0.0 ~ 1.0]
)来调整过渡动画的播放进度。
下面对场景 1
的布局文件进行修改,移除两个按钮,加入一个 SeekBar
,修改后的布局代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/motionLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/activity_main_motion_scene"><ImageViewandroid:id="@+id/image"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/ic_launcher"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><SeekBarandroid:id="@+id/seekBar"android:layout_width="240dp"android:layout_height="wrap_content"android:layout_marginBottom="56dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" /></androidx.constraintlayout.motion.widget.MotionLayout>
复制代码
布局预览如下图所示:
修改 MainActivity
中的代码:
public class MainActivity extends AppCompatActivity {private MotionLayout mMotionLayout;private SeekBar mSeekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_scene1);mMotionLayout = findViewById(R.id.motionLayout);mSeekBar = findViewById(R.id.seekBar);mSeekBar.setMax(0);mSeekBar.setMax(100);mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {mMotionLayout.setProgress((float) (progress * 0.01));}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});}
}
复制代码
效果如下图所示:
监听 MotionLayout 过渡
可以调用 MotionLayout
的 setTransitionListener()
方法向 MotionLayout
对象注册一个过渡动画监听器,这个监听器可以监听过渡动画的播放进度和结束事件。
public void setTransitionListener(MotionLayout.TransitionListener listener)
复制代码
TransitionListener
监听器接口:
public interface TransitionListener {// 过渡动画正在运行时调用void onTransitionChange(MotionLayout motionLayout, int startId, int endId, float progress);// 过渡动画结束时调用void onTransitionCompleted(MotionLayout motionLayout, int currentId);
}
复制代码
提示:
TransitionListener
接口在alpha
版本中有所改动,可多出了2
个回调方法:onTransitionStarted
和onTransitionTrigger
。由于MotionLayout
还处于alpha
版本,并未正式发布,因此有所改动也是正常。
例:
MotionLayout motionLayout = findViewById(R.id.motionLayout);
motionLayout.setTransitionListener(new MotionLayout.TransitionListener() {@Overridepublic void onTransitionChange(MotionLayout motionLayout, int i, int i1, float v) {Log.d("App", "onTransitionChange: " + v);}@Overridepublic void onTransitionCompleted(MotionLayout motionLayout, int i) {Log.d("App", "onTransitionCompleted");}
});
复制代码
结语
本篇文章到此就结束了,你可能会觉得前面的例子不够炫酷,这里给出一个炫酷点的例子(这个例子很简单,建议读者动手尝试实现一下):
后续文章:
- 《MotionLayout 基础教程 2》
参考文章:
https://www.jianshu.com/p/5203cf11d943
转载于:https://juejin.im/post/5cadc1ba6fb9a0686e40bb82
MotionLayout 基础教程相关推荐
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- [SQL基础教程] 1-5 表的删除和更新
[SQL基础教程] 1-5 表的删除和更新 表的删除 语法 DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法 ALTER TABLE<表名> ...
- python 包用法_Python 基础教程之包和类的用法
Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...
- Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0
Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要 ...
- Python培训基础教程都教哪些
根据相关数据统计,目前学习Python技术的同学大多数是零基础,都是从其他行业转型来学习的,那么Python培训基础教程都教哪些呢?好不好学呢?来看看下面的详细介绍. Python培训基础教程都教哪些 ...
- 深度学习之Pytorch基础教程!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤,Datawhale高校群成员,深圳大学 随着深度学习的发展 ...
- python平稳性检验_时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)...
时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python) 发布时间:2019-01-10 00:02, 浏览次数:620 , 标签: Python 导读: 本文介绍了数据平稳 ...
- %3c- r语言运算符,R语言基础教程之运算符
原标题:R语言基础教程之运算符 运算符类型 在R编程中有以下类型的运算符 - 算术运算符 关系运算符 逻辑运算符 赋值运算符 其他运算符1.算术运算符 下表显示了R语言支持的算术运算符.运算符对向量的 ...
- python分类器鸢尾花怎么写_python机器学习基础教程-鸢尾花分类
一: 环境准备: 1.导入的库: importnumpy as npimportmatplotlib.pyplot as pltimportpandas as pdimport mglearn 2.导 ...
最新文章
- 生产环境主从数据同步不了?
- mybaits四-1:增删改查的实现
- C#事件-自定义事件
- 洛谷P4742(tarjan缩点+拓扑DP)
- leetcode —— 133. 克隆图
- tomcat使用自签名证书实现https加密访问
- windows安装mysql修改密码_1、Windows下安装mysql-8.0.12及修改初始密码
- hql语句关联查询(select new )
- vb.net Listbox控件横轴的进度条问题
- 51单片机学习笔记0 -- 仿真软件安装(Protues8.0)
- 内部系统界面设计【下】 | 设计技巧
- 关于tomcat项目中poi报错出现的问题
- 自学云计算进度(2)-Linux基础命令
- eclipse cdt + rse文件保存遇到的问题
- Fiddler调试利器
- 基于lerna重构Concis组件库
- 理解javaScript的数据类型之字符串类型
- 芴基噁二唑铱配合物|阳离子型铱配合物Ir(F_2ppy)_2(Br_2bpy)+PF-6
- 通过JDBC-ODBC连接SQL Server数据库
- Python | 判定IP地址合法性的四种方法
热门文章
- AR与大数据 珠联璧合带来的无限想象空间
- inode与ln命令
- 《精通移动app测试实战:技术、工具和案例》新书上市
- java连接mongod抛java.net.SocketTimeoutException: connect timed out异常(2015-11-07 20:29:58)
- 1/3 常用符号:类型说明符
- ELK日志分析平台.1-搭建
- 【XSY2111】Chef and Churus 分块 树状数组
- 百度推出 MIP Baidu Path链接
- 微信小程序开发教程第七章:微信小程序编辑名片页面开发
- D3 Data Visualization in Ext JS