5分钟带你学会MotionLayout 第二篇

1、前言

最近在开发中,同事居然对MontionLayout一知半解,那怎么行!百里偷闲写出此文章,一起学习、一起进步。如果写的不好,或者有错误之处,恳请在评论、私信、邮箱指出,万分感谢🙏

希望你在阅读这篇文章的时候,已经对下面的内容熟练掌握了

  • Animated Vector Drawable
  • Property Animation framework
  • LayoutTransition animations
  • Layout transitions with TransitionManager

对了还有ConstraintLayout务必熟练掌握

对了,如果可以,请跟随敲代码,毕竟你脑补的代码,没有编译器。

当然你也可以阅读我的上一篇文章

  • 5分钟带你学会MotionLayou 第一篇
  • 5分钟带你学会MotionLayou 第二篇

2、OnSwipe、OnClick

同学们可能发现了,在上篇文章中,我们使用了两个交互动作OnSwipeOnClick

   <Transitionmotion:constraintSetEnd="@+id/end"motion:constraintSetStart="@+id/start"motion:duration="1000">
​<OnSwipemotion:dragDirection="dragEnd"motion:touchAnchorId="@+id/button1"motion:touchAnchorSide="end" /><!--OnClick 用于处理用户点击事件 --><!--targetId 设置触发点击事件的组件 --><!--clickAction 设置点击操作的响应行为,这里是使动画过渡到结束状态 --><OnClickmotion:clickAction="transitionToEnd"motion:targetId="@+id/button1" />
​</Transition>

这两位直面意思就是点击事件和滑动事件,OnClick的属性是非常简洁的,因为只是个点击事件而已

  • targetId:点击事件要应用的视图 ID。

  • clickAction:定义点击事件的行为,可以有以下几种取值:

    • toggle:切换视图的状态。
    • transitionToEnd:将视图从当前位置过渡到结束位置。
    • transitionToStart:将视图从当前位置过渡到开始位置。
    • jumpToEnd:立即将视图移动到结束位置。
    • jumpToStart:立即将视图移动到开始位置。

OnSwipe的话,属性就比较多,但是都很直白,各位直接看看,需要用的时候找一找,多用用多看看就记住啦。

  • dragScale:定义拖拽操作的缩放比例。这个属性通常用于实现一些放大缩小的效果,可以让用户通过手势对视图进行缩放。

  • dragThreshold:定义拖拽的最小阈值,当拖拽距离小于该值时,视图不会响应拖拽事件。这个属性可以用于控制视图响应拖拽事件的灵敏度。

  • autoCompleteMode:定义自动完成的模式,可以有以下两种取值:

    • continuousVelocity:使用连续的速度自动完成。
    • spring:使用弹簧效果自动完成。
  • maxVelocity:定义最大速度,当拖拽速度超过该值时,视图将不再响应拖拽事件。

  • maxAcceleration:定义最大加速度,当拖拽加速度超过该值时,视图将不再响应拖拽事件。

  • springMass:定义弹簧质量。

  • springStiffness:定义弹簧刚度。

  • springDamping:定义弹簧阻尼。

  • springStopThreshold:定义弹簧停止的阈值,当速度小于该值时,弹簧将停止弹动。

  • springBoundary:定义弹簧边界,可以有以下几种取值:

    • overshoot:超出边界时弹簧会继续弹动。
    • bounceStart:当拖拽到开始位置时弹簧会弹动。
    • bounceEnd:当拖拽到结束位置时弹簧会弹动。
    • bounceBoth:当拖拽到开始或结束位置时弹簧会弹动。
  • dragDirection:定义拖拽方向,可以有以下几种取值:

    • horizontal:只能水平拖拽。
    • vertical:只能垂直拖拽。
    • both:可以水平和垂直拖拽。
  • touchAnchorId:定义触摸点的锚定视图 ID。

  • touchAnchorSide:定义触摸点在锚定视图中的位置,可以有以下几种取值:

    • top:触摸点位于锚定视图的顶部。
    • bottom:触摸点位于锚定视图的底部。
    • left:触摸点位于锚定视图的左侧。
    • right:触摸点位于锚定视图的右侧。
    • center:触摸点位于锚定视图的中心。
  • rotationCenterId:定义旋转中心的视图 ID。

  • touchRegionId:定义触摸区域的视图 ID。

  • limitBoundsTo:定义限制边界的视图 ID。

  • nestedScrollFlags:定义嵌套滚动的标志位,可以有以下几种取值:

    • none:不支持嵌套滚动。
    • disablePostScroll:禁止滚动结束后的滚动。
    • disableScroll:禁止滚动。
    • supportScrollUp:支持向上滚动。
  • moveWhenScrollAtTop:定义是否在滚动到顶部时允许拖拽。

  • onTouchUp:定义当手指离开屏幕时的行为,可以有以下几种取值:

    • autoComplete:自动完成拖拽。
    • autoCompleteToStart:自动完成拖拽并回到开始位置。
    • autoCompleteToEnd:自动完成拖拽并回到结束位置。
    • stop:停止拖拽。
    • decelerate:减速拖拽。
    • decelerateAndComplete:减速拖拽并完成拖拽。
    • neverCompleteToStart:永远不要自动完成到开始位置。
    • neverCompleteToEnd:永远不要自动完成到结束位置。

对于弹簧效果,单纯是为了更加自然。

以上就是两个的全部(部分?)属性啦,如果你需要更详细的了解,你可以在MotionLayout的资源目录中找到。

3、KeyFrameSet

在输入<符号时,弹出的三个提示,前面两个我们已经了解了。那么第三个KeyFrameSet是什么意思呢。

在一些情况下,您可能希望在转换视图状态时,具有中间状态,即一个需要经过但不需要停留的状态。您可以指定多于两个 ConstraintSet,但更轻量的方法是使用 Keyframes。

在约束布局中使用 Keyframes,需要定义一个 KeyPosition 对象和一个 KeyAttribute 对象。KeyPosition 对象定义了中间状态的位置,KeyAttribute 对象定义了中间状态的属性值。您可以将多个 KeyPositionKeyAttribute 对象组合成一个 Keyframes 对象,并将其应用于约束布局中的任何属性。

fragment_motion_04_basic.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"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/ml_container"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/motion_layout_04_scene"tools:showPaths="true">
​<Viewandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:background="@color/orange"android:text="Button"/>
​<Viewandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:background="@color/orange"android:text="Button" />
</androidx.constraintlayout.motion.widget.MotionLayout>

motion_layout_04_scene.xml

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:motion="http://schemas.android.com/apk/res-auto">
​<Transitionmotion:constraintSetEnd="@+id/end"motion:constraintSetStart="@+id/start"motion:duration="1000"motion:motionInterpolator="linear"><OnSwipemotion:dragDirection="dragRight"motion:touchAnchorId="@+id/button1"motion:touchAnchorSide="right" />
​<KeyFrameSet><KeyPositionmotion:framePosition="25"motion:keyPositionType="pathRelative"motion:motionTarget="@+id/button1"motion:percentY="0.1" />
​<KeyPositionmotion:framePosition="75"motion:keyPositionType="pathRelative"motion:motionTarget="@+id/button1"motion:percentY="-0.1" /></KeyFrameSet>
​<KeyFrameSet><KeyPositionmotion:framePosition="25"motion:keyPositionType="pathRelative"motion:motionTarget="@+id/button2"motion:percentY="0.3" />
​<KeyPositionmotion:framePosition="75"motion:keyPositionType="pathRelative"motion:motionTarget="@+id/button2"motion:percentY="-0.3" /><KeyAttributeandroid:scaleX="2"android:scaleY="2"android:rotation="-45"motion:framePosition="50"motion:motionTarget="@id/button2" /></KeyFrameSet></Transition>
​<ConstraintSet android:id="@+id/start"><Constraintandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"
​android:layout_marginStart="6dp"motion:layout_constraintBottom_toTopOf="@id/button2"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toTopOf="parent" />
​<Constraintandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"
​android:layout_marginStart="8dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button1" /></ConstraintSet>
​<ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:layout_marginEnd="8dp"motion:layout_constraintBottom_toTopOf="@id/button2"motion:layout_constraintEnd_toEndOf="parent"motion:layout_constraintHorizontal_bias="1"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toTopOf="parent" />
​
​<Constraintandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:layout_marginEnd="8dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintEnd_toEndOf="parent"motion:layout_constraintHorizontal_bias="1"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button1" /></ConstraintSet>
​
</MotionScene>

 

效果如下啦。

 

KeyPosition还有很多属性,多数都是一看就懂的属性

  • keyPositionType:定义如何计算关键帧的偏差。可以设置为 deltaRelativepathRelativeparentRelative 三种取值之一。使用 deltaRelative 时,关键帧的偏差相对于线性路径计算;使用 pathRelative 时,关键帧的偏差相对于路径计算;使用 parentRelative 时,关键帧的偏差相对于父视图计算。
  • percentXpercentY:定义关键帧在 X 和 Y 轴上的位置。可以设置为 0 到 1 之间的浮点数,表示从开始状态到结束状态之间的相对位置。
  • percentWidthpercentHeight:定义宽度和高度的变化量。可以设置为 0 到 1 之间的浮点数,表示从开始状态到结束状态之间的相对变化量。注意,如果宽度或高度没有变化,则这些属性将没有任何效果。
  • framePosition:定义关键帧在动画中的位置。可以设置为 0 到 100 之间的整数,表示从动画开始到结束之间的相对位置。
  • motionTarget:定义应用此关键帧的运动目标。可以是一个视图或者一个运动场景。
  • transitionEasing:定义关键帧的过渡缓动效果。可以使用 Android 系统中提供的各种缓动函数,比如 easeIn, easeOut 等。
  • pathMotionArc:定义关键帧在路径上的运动方式。可以设置为 nonestartVerticalendVerticalfliprotate 等五种取值之一。
  • curveFit:定义关键帧的插值方式。可以设置为 linearsplinediscrete 等三种取值之一。
  • drawPath:定义是否在编辑器中绘制关键帧路径。
  • sizePercent:定义宽度和高度的百分比。可以设置为 0 到 1 之间的浮点数,表示相对于视图父级的百分比。

因为keyPositionType可以说很多,我会在后面的文章,继续展开。这里我们只使用pathRelative

KeyAttribute还有很多属性,多数都是一看就懂的属性

  • framePosition:定义关键帧在动画中的位置。可以设置为 0 到 100 之间的整数,表示从动画开始到结束之间的相对位置。
  • motionTarget:定义应用此关键帧的运动目标。可以是一个视图或者一个运动场景。
  • transitionEasing:定义关键帧的过渡缓动效果。可以使用 Android 系统中提供的各种缓动函数,比如 easeIn, easeOut 等。
  • curveFit:定义关键帧的插值方式。可以设置为 linearsplinediscrete 等三种取值之一。
  • motionProgress:定义关键帧的运动进度,即从开始状态到结束状态之间的进度百分比。
  • alpha:定义视图的不透明度。可以设置为 0 到 1 之间的浮点数,表示视图的透明度。
  • elevation:定义视图的高度。可以设置为一个浮点数,表示视图的高度。
  • rotationrotationXrotationY:定义视图的旋转角度,可以分别设置 X、Y、Z 轴上的旋转角度。
  • transformPivotXtransformPivotY:定义视图的变换中心点坐标。
  • transformPivotTarget:定义变换中心点的目标视图。
  • transitionPathRotate:定义视图在路径上的旋转角度。
  • scaleXscaleY:定义视图的缩放比例。
  • translationXtranslationYtranslationZ:定义视图的位置偏移量。

4、CustomAttribute

如果仅仅只能动画化我们之前提过的属性,那么MotionLayout只会显得过于单调,而如果通过代码去动态修改某些状态,那就体现不出MotionLayout的优势了。

所以CustomAttribute一个自定义属性集合,用于将自定义属性应用于视图或运动场景。使用 CustomAttribute,您可以将任何自定义属性与约束布局中的其他属性结合使用,从而实现更加复杂和灵活的布局效果。

CustomAttribute 自定义属性集合中的一些关键属性:

  • attributeName:定义自定义属性的名称。。
  • customColorValue:定义自定义颜色值。可以设置为一个整数,表示颜色值。
  • customDimension:定义自定义尺寸值。可以设置为一个浮点数,表示尺寸值。
  • customFloatValue:定义自定义浮点数值。可以设置为任何浮点数。
  • customIntegerValue:定义自定义整数值。可以设置为任何整数。
  • customStringValue:定义自定义字符串值。可以设置为任何字符串。

我们来试一下

fragment_motion_05_basic.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"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/ml_container"android:layout_width="match_parent"android:layout_height="match_parent"app:layoutDescription="@xml/motion_layout_05_scene"tools:showPaths="true">
​<Viewandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:background="@color/orange"android:text="Button"app:layout_constraintBottom_toTopOf="@id/button2"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
​<androidx.constraintlayout.utils.widget.ImageFilterViewandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:src="@mipmap/icon_menu_emoticon1"app:altSrc="@mipmap/icon_menu_emoticon3"android:text="Button"app:layout_constraintBottom_toTopOf="@id/button3"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/button1" />
​<androidx.constraintlayout.utils.widget.ImageFilterViewandroid:id="@+id/button3"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"android:src="@mipmap/icon_menu_emoticon2"android:text="Button"app:layout_constraintBottom_toTopOf="@id/button4"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/button2" />
​
</androidx.constraintlayout.motion.widget.MotionLayout>

motion_layout_05_scene.xml

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:motion="http://schemas.android.com/apk/res-auto">
​<Transitionmotion:constraintSetEnd="@+id/end"motion:constraintSetStart="@+id/start"motion:duration="1000"><!--OnClick 用于处理用户点击事件 --><!--targetId 设置触发点击事件的组件 --><!--clickAction 设置点击操作的响应行为,这里是使动画过渡到结束状态 --><OnSwipemotion:dragDirection="dragEnd"motion:touchAnchorId="@+id/button1"motion:touchAnchorSide="end" />
​</Transition>
​<ConstraintSet android:id="@+id/start">
​<Constraintandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"motion:layout_constraintBottom_toTopOf="@id/button2"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toTopOf="parent"><CustomAttributemotion:attributeName="backgroundColor"motion:customColorValue="#D81B60" /></Constraint>
​<Constraintandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"motion:layout_constraintBottom_toTopOf="@id/button3"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button1"><CustomAttributemotion:attributeName="crossfade"motion:customFloatValue="0" /></Constraint><Constraintandroid:id="@+id/button3"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"motion:layout_constraintBottom_toTopOf="@id/button4"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button2" ><CustomAttributemotion:attributeName="saturation"motion:customFloatValue="1" /></Constraint>
​</ConstraintSet>
​<ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/button1"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginEnd="8dp"motion:layout_constraintBottom_toTopOf="@id/button2"motion:layout_constraintEnd_toEndOf="parent"motion:layout_constraintHorizontal_bias="1"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toTopOf="parent"><CustomAttributemotion:attributeName="backgroundColor"motion:customColorValue="#9999FF" /></Constraint>
​<Constraintandroid:id="@+id/button2"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"motion:layout_constraintBottom_toTopOf="@id/button3"motion:layout_constraintEnd_toEndOf="parent"motion:layout_constraintHorizontal_bias="1"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button1"><CustomAttributemotion:attributeName="crossfade"motion:customFloatValue="1" /></Constraint>
​<Constraintandroid:id="@+id/button3"android:layout_width="64dp"android:layout_height="64dp"android:layout_marginStart="8dp"motion:layout_constraintBottom_toTopOf="@id/button4"motion:layout_constraintEnd_toEndOf="parent"motion:layout_constraintHorizontal_bias="1"motion:layout_constraintStart_toStartOf="parent"motion:layout_constraintTop_toBottomOf="@id/button2" ><CustomAttributemotion:attributeName="saturation"motion:customFloatValue="0" />
​</Constraint></ConstraintSet>
​
</MotionScene>

值得注意的是

自定义属性的名称必须与View具有相应的setter方法名称相匹配,才能在MotionLayout中使用。例如,如果您想要定义一个名为"customText"的CustomAttribute来控制TextView的文本内容,那么TextView中需要有一个名为为"setCustomText"的方法,以便MotionLayout能够找到相应的setter方法。

因此,只有View具有相应的setter方法的自定义属性才能被使用。如果您想要使用一个View没有的属性,您需要创建一个新的自定义View并实现相应的setter和getter方法。

5、下个篇章

因为篇幅原因,我们先到这,下一篇我们将会深入了解各种使用案例~。

如果您有任何疑问、对文章写的不满意、发现错误或者有更好的方法,欢迎在评论、私信或邮件中提出,非常感谢您的支持。🙏

6、感谢

  1. 校稿:ChatGpt
  2. 文笔优化:ChatGpt

作者:AlbertZein
链接:https://juejin.cn/post/7221425945238978615
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29599.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅:宣布一件大事,大模型与 AIGC 专场来啦

文末有抽奖&#xff01; 6月30日-7月1日&#xff0c;在由稀土掘金开发者社区主办的稀土开发者大会上&#xff0c;邀你与最专业最前沿的嘉宾面对面交流&#xff01;6月30日上午的主会场&#xff0c;北京大学王选计算机研究所教授、CCF 自然语言处理专委会秘书长万小军&#xff0…

文末有抽奖|线下嗨聊 AIGC两整天!为什么我推荐你参加稀土开发者大会?!...

稀土开发者大会 6月30日-7月1日 北京新云南皇冠假日酒店&#xff08;近字节融中心工区&#xff09; &#x1f914; 若问今年谁最火&#xff1f;ChatGPT 答曰&#xff1a;AIGC 还有我&#xff01; 要问技术圈今年最火的话题是什么&#xff1f;无外乎这些关键词&#xff1a;AIGC、…

我用ChatGPT,给RabbitMQ加了个连接池

上次我把 RabbitMQ 集成到项目中&#xff0c;但是每次使用 RabbitMQ 时都去 New 一个连接&#xff0c;导致并发起不来&#xff0c;所以这次我们就给 RabbitMQ 加一个连接池。 为了偷个懒&#xff0c;我直接用 ChatGPT 教我加。 01 ChatGPT 生成的代码 我输入的关键字如下&am…

ClickPrompt

太长不看版&#xff1a; GitHub&#xff1a;github.com/prompt-engi…在线地址&#xff1a;www.clickprompt.org/ 欢迎来添加你的 AI Prompt 和使用心得。 再上个截图&#xff1a; ClickPrompt&#xff1a;简化你的 Prompt 设计之旅 上周末&#xff0c;为了更好地记录与分享…

线下嗨聊 AIGC两整天!为什么我推荐你参加稀土开发者大会?

&#x1f914; 若问今年谁最火&#xff1f; ChatGPT 答曰&#xff1a;AIGC 还有我&#xff01; 要问技术圈今年最火的话题是什么&#xff1f;无外乎这些关键词&#xff1a;AIGC、ChatGPT、某端已死、各行各业✖️ChatGPT…… 究其原因&#xff0c;是因为 AI 这些年在不断更新…

nodejs 获取微信小程序二维码

getQRCode(accessToken) {const { ctx } this;let parameters;let url https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token${accessToken};await axios({method: "post",url: url,responseEncoding: "base64", //重点data: {page: "pa…

我要开始在B站分享视频教程了

目录 前言一、精品网站分享ChatGPT菜鸟在线编辑器在线音乐网站 二、常用工具知识学习编程前端 视图文关于俺 前言 大家好&#xff0c;我是MIKE笔记&#xff0c;一名在CSDN经常分享技术文章和教程的博主。如果你也喜欢我的文章&#xff0c;那么我想向你推荐我的B站频道&#xf…

chatgpt赋能python:如何用Python做兼职的SEO

如何用Python做兼职的SEO SEO是指优化网站内容和结构&#xff0c;以便在搜索引擎排名中获得更高的排名。在今天的数字时代中&#xff0c;SEO对于许多企业和网站来说非常重要。Python作为一种简单易学的编程语言&#xff0c;可以用来帮助优化和管理网站。在本文中&#xff0c;我…

[经验教程]iPhone苹果手机Siri怎么设置?

iPhone苹果手机Siri怎么设置&#xff1f; 1、在iPhone苹果手机上打开手机设置&#xff1b; 2、在iPhone苹果手机设置内找到Siri与搜索&#xff0c;并点击进入&#xff1b; 3、进入后&#xff0c;在Siri与搜索内设置&#xff1b; 原文来源&#xff1a;https://www.caochai.com/…

siri快捷指令_入门的最佳Siri快捷方式

siri快捷指令 The new Shortcuts app that was introduced in iOS 12 lets you create shortcuts to automate any number of tasks. Here are a handful of good ones to get you started, with the hopes that it gets your creative juices flowing. iOS 12中引入的新的快捷…

练习四级英语听力推荐用哪个APP?

练习四级英语听力推荐用哪个APP&#xff1f;大学英语四级想必是大多数同学都要去追求的一个目标&#xff0c;今天给大家推荐几个对学习英语和四级考试帮助非常大的软件&#xff0c;希望能帮助到每一个面临英语四级考试的同学。 有道词典 大家都知道对于英语四级考试来说&#…

English Learning - L2-12 英音地道语音语调 音的同化 爆破技巧 2023.04.4 周二

English Learning - L2-12 英音地道语音语调 音的同化 爆破技巧 2023.04.4 周二 音的同化因声带影响发生同化因发音部位的影响而发生同化 失去爆破摆拍爆破&#xff08;爆破音&#xff0b;爆破音&#xff09;谦让型爆破爆破音摩擦音 与 爆破音破擦音爆破音鼻辅音/舌边音 爆破综…

如何看懂“听力图”?

听力图是一张形象地“描绘”患者的听力状况的“阴晴”表&#xff0c;它标记了患者的听力的情况&#xff0c;是判断听力是否健康的重要途径之一。 当我们拿到听力检查报告时&#xff0c;我们应该看些什么&#xff0c;关注些什么内容&#xff0c;我们能从检查单中得到怎样的信息…

Lecture 5 Part of Speech Tagging

目录 POS application: Information Extraction 词性应用&#xff1a;信息提取 POS Open Class 开放类词性Problem of word classes: Ambiguity 词类问题&#xff1a;模糊性Tagsets 标记集Penn Treebank Tags:Derived Tags: 衍生标签Tagged Text Example 标记文本示例Reasons f…

英语听力练习

生词积累生词所在句子 blast an explosion, such as that caused by dynamite(dynamite:a powerful explosive used especially in mining) The blast hit a bus about to set off for the Ugandan capital Kampala. collapse the act of falling down or fa…

如何做代码抽象设计,多种设计模式的应用【四种抽象方式,干货附上代码】

代码这种东西&#xff0c;机器不管你写的怎么样&#xff0c;肯定能识别&#xff0c; 人就不一样了&#xff0c;前人拉屎后人踩屎&#xff0c;一坨认栽&#xff0c;n坨就有点过分了哈 一般写代码也不用太高大上&#xff0c;很多接口还是很简单的&#xff0c;如果把各种设计模式搞…

我开发了一个AI网站,速速围观,文末全是福利

目录 前言 AI大侠能提供什么功能 AI聊天 AI写作 AI编程 AI绘画 以及其它近10种AI工具 AI大侠后续功能计划 SQL优化 共建计划 写到最后 大家好&#xff0c;我是大侠&#xff0c;AI领域的专业博主 前言 最近有很多小伙伴问大侠&#xff1a; 有没有国内免费安全可用…

chatgpt赋能python:如何将Python写的游戏添加联机功能

如何将Python写的游戏添加联机功能 Python是一种流行的编程语言&#xff0c;广泛用于游戏开发。有许多游戏是单机版&#xff0c;但联机游戏可以为玩家们提供更多的娱乐和社交互动。本文将介绍如何为你的Python游戏添加联机功能&#xff0c;以便玩家们可以在Internet上与其他玩…

带你了解一下关于ChatGPT的快速进化过程

ChatGPT是一种基于GPT-3的聊天机器人&#xff0c;它可以理解自然语言&#xff0c;并生成符合人类对话语义的响应。在过去几年中&#xff0c;随着深度学习技术和NLP领域的快速发展&#xff0c;ChatGPT也在不断地进化和发展。 ChatGPT早期的版本是建立在GPT-3的基础上&#xff0…

BUUCTF-Reverse —— 第二页的题目集合

[MRCTF2020]hello_world_go 用go语言编写的程序&#xff0c;go语言编写的程序用的是静态链接的方法所以程序都很大&#xff0c;而且反汇编后的伪代码也很麻烦。 因为是elf文件&#xff0c;动态调试elf文件的话&#xff0c;可以用IDA连linux虚拟机&#xff0c;也可以使用gdb动…