Android动画

news2024/11/29 20:32:13

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、动画实现
    • 3.1 帧动画
      • 资源文件中实现帧动画
      • 代码中实现帧动画
    • 3.2 补间动画
      • 3.2.1 基本语法
      • 3.2.2 使用方式
      • 3.2.3 我们也可以在java代码中直接使用
    • 3.3 动画插值器
      • 自定义插值器
    • 3.4 属性动画
      • xml中定义属性动画
      • 代码中定义属性动画
  • 四、属性动画与视图动画的区别
  • 五、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习基础知识,温故知新。

本文我们就来讲讲安卓动画相关的知识。

二、概览

在Android中,动画我们大致分为两大类,

  • 1、视图动画,即帧动画补间动画
    • 补间动画:通过使用 Animation 对单张图片执行一系列转换来创建动画,这是一种在 XML 中定义的动画(也可以代码配置),用于对图形执行旋转、淡出、移动和拉伸等转换。
    • 帧动画:通过使用 AnimationDrawable 按顺序显示一系列图片来创建动画,就像放电影一样,一帧一帧的。
  • 2、属性动画:通过使用 Animator 在设定的时段内修改对象的属性值来创建动画。

下面我们分别来讲这几种动画实现。

三、动画实现

3.1 帧动画

在 XML 中定义的按顺序显示一系列图片的动画(如电影)。我们在实际开发中可以用两种方式来做。

资源文件中实现帧动画

帧动画编译后的资源数据类型为 AnimationDrawable ,动画的开始是AnimationDrawable控制的。

1、 新建动画文件bg_animation.xml,文件位置:

res/drawable/filename.xml
文件名用作资源 ID。

语法如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >                                   如果您想要执行一次动画,则为 "true";如果要循环播放动画,则为 "false"
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"      可绘制资源
        android:duration="integer" />                                      显示此帧的持续时间,以毫秒为单位
</animation-list>

2、使用

    // 要播放动画的组件设置resource
    aivingImg.setImageResource(R.drawable.bg_animation);

    // 通过组件找到对应的 AnimationDrawable ,资源文件编译后,就是这个玩意,所以要用到
    AnimationDrawable animationDrawable = (AnimationDrawable) aivingImg.getDrawable();
    
    // 开始动画
    animationDrawable.start();

代码中实现帧动画

我们知道帧动画编译后的资源数据类型为 AnimationDrawable,所以可以直接操作这个类来播放动画。

AnimationDrawable常用方法

addFrame:添加一幅图片帧,并指定该帧的持续时间(单位毫秒)。
setOneShot:设置是否只播放一次。为true表示只播放一次,为false表示循环播放。
start:开始播放。注意,设置宿主视图后才能进行播放。
stop:停止播放。
isRunning:判断是否正在播放。

上代码
调用ImageView对象的setImageDrawable方法将动画图形加载到图像视图中

    AnimationDrawable ad_frame = new AnimationDrawable();
    ad_frame.addFrame(getResources().getDrawable(R.mipmap.flow_p1),50);
    ad_frame.addFrame(getResources().getDrawable(R.mipmap.flow_p2),50);
    ad_frame.setOneShot(false);
    iv_pic.setImageDrawable(ad_frame);
    ad_frame.start();

3.2 补间动画

补间动画是在 XML 中定义的动画,一种二维空间动画,补间动画根据动画的起点、终点、大小、旋转情况和其他常见方面来计算动画,
动画的方式无非就几种方式,旋转、淡出(透明度)、移动和拉伸等,该动画是作用在整个view上的,包含背景图。

动画编译后的资源数据类型为 Animation ,动画的开始是Animation控制的,另外还有 AnimationSet 承载属性。

3.2.1 基本语法

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"   容纳其他动画元素 或其他 <set> 元素的容器。代表 AnimationSet

    android:duration="5000"                                           动画时间,单位毫秒
    android:startOffset="1000"                                        动画延迟执行时间
    android:fillBefore="true"                                         动画播放完后,视图是否会停留在动画开始的状态,默认为true
    android:fillAfter="false"                                         动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
    android:fillEnabled="true"                                        是否应用fillBefore值,对fillAfter值无影响,默认为true
    android:repeatMode="restart"                                      选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
    android:repeatCount="3"                                           重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
    
    android:interpolator="@[package:]anim/interpolator_resource"  插值器资源
    android:shareInterpolator=["true" | "false"] >                如果要在所有子元素中共用同一插值器,则为 "true"
    
    <alpha                                                淡入或淡出动画(透明度)。代表 AlphaAnimation。
        android:fromAlpha="float"                            浮点数。起始不透明度偏移,0.0 表示透明,1.0 表示不透明。
        android:toAlpha="float" />                           浮点数。结束不透明度偏移,0.0 表示透明,1.0 表示不透明。
        
    <scale                                               拉伸动画。代表 ScaleAnimation。
        android:fromXScale="float"                           起始 X 尺寸偏移,其中 1.0 表示不变
        android:toXScale="float"                             结束 X 尺寸偏移,其中 1.0 表示不变。
        android:fromYScale="float"                           起始 Y 尺寸偏移,其中 1.0 表示不变
        android:toYScale="float"                             结束 Y 尺寸偏移,其中 1.0 表示不变
        android:pivotX="float"                               在对象缩放时要保持不变的 X 坐标
        android:pivotY="float" />                            在对象缩放时要保持不变的 Y 坐标
        
    <translate                                           竖直和/或水平 移动。代表 TranslateAnimation
        android:fromXDelta="float"                           浮点数或百分比。起始 X 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素宽度的百分比(例如 "5%");或相对于父项宽度的百分比(例如 "5%p")。
        android:toXDelta="float"                             浮点数或百分比。结束 X 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素宽度的百分比(例如 "5%");或相对于父项宽度的百分比(例如 "5%p")。
        android:fromYDelta="float"                           浮点数或百分比。起始 Y 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素高度的百分比(例如 "5%");或相对于父项高度的百分比(例如 "5%p")。
        android:toYDelta="float" />                          浮点数或百分比。结束 Y 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素高度的百分比(例如 "5%");或相对于父项高度的百分比(例如 "5%p")。
        
    <rotate                                              旋转动画。代表 RotateAnimation。
        android:fromDegrees="float"                          浮点数。起始角度位置,以度为单位。
        android:toDegrees="float"                            浮点数。结束角度位置,以度为单位。
        android:pivotX="float"                               浮点数或百分比。旋转中心的 X 坐标。表示方式:相对于对象左边缘的像素数(例如 "5");相对于对象左边缘的百分比(例如 "5%");或相对于父级容器左边缘的百分比(例如 "5%p")。
        android:pivotY="float" />                            浮点数或百分比。旋转中心的 Y 坐标。表示方式:相对于对象上边缘的像素数(例如 "5");相对于对象上边缘的百分比(例如 "5%");或相对于父级容器上边缘的百分比(例如 "5%p")。
    <set>
        ...
    </set>
</set>

动画的定义,也可以不用set组合,直接定义单个动画,如

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"                                           动画时间,单位毫秒
    android:startOffset="1000"                                        动画延迟执行时间
    android:fillBefore="true"                                         动画播放完后,视图是否会停留在动画开始的状态,默认为true
    android:fillAfter="false"                                         动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
    android:fillEnabled="true"                                        是否应用fillBefore值,对fillAfter值无影响,默认为true
    android:repeatMode="restart"                                      选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
    android:repeatCount="3"                                           重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
    android:interpolator="@android:interpolator/decelerate_quad"      插值器资源

    android:fromAlpha="0.0"
    android:toAlpha="1.0" />
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"                                           动画时间,单位毫秒
    android:startOffset="1000"                                        动画延迟执行时间
    android:fillBefore="true"                                         动画播放完后,视图是否会停留在动画开始的状态,默认为true
    android:fillAfter="false"                                         动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
    android:fillEnabled="true"                                        是否应用fillBefore值,对fillAfter值无影响,默认为true
    android:repeatMode="restart"                                      选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
    android:repeatCount="3"                                           重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
    android:interpolator="@android:interpolator/decelerate_quad"      插值器资源

    android:fromXScale="float"                           起始 X 尺寸偏移,其中 1.0 表示不变
    android:toXScale="float"                             结束 X 尺寸偏移,其中 1.0 表示不变。
    android:fromYScale="float"                           起始 Y 尺寸偏移,其中 1.0 表示不变
    android:toYScale="float"                             结束 Y 尺寸偏移,其中 1.0 表示不变
    android:pivotX="float"                               在对象缩放时要保持不变的 X 坐标
    android:pivotY="float" />                            在对象缩放时要保持不变的 Y 坐标
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"                                           动画时间,单位毫秒
    android:startOffset="1000"                                        动画延迟执行时间
    android:fillBefore="true"                                         动画播放完后,视图是否会停留在动画开始的状态,默认为true
    android:fillAfter="false"                                         动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
    android:fillEnabled="true"                                        是否应用fillBefore值,对fillAfter值无影响,默认为true
    android:repeatMode="restart"                                      选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
    android:repeatCount="3"                                           重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
    android:interpolator="@android:interpolator/decelerate_quad"      插值器资源

    android:fromXDelta="float"                           浮点数或百分比。起始 X 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素宽度的百分比(例如 "5%");或相对于父项宽度的百分比(例如 "5%p")。
    android:toXDelta="float"                             浮点数或百分比。结束 X 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素宽度的百分比(例如 "5%");或相对于父项宽度的百分比(例如 "5%p")。
    android:fromYDelta="float"                           浮点数或百分比。起始 Y 偏移量。表示方式:相对于正常位置的像素数(例如 "5");相对于元素高度的百分比(例如 "5%");或相对于父项高度的百分比(例如 "5%p")。
    android:toYDelta="float"/>
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"                                           动画时间,单位毫秒
    android:startOffset="1000"                                        动画延迟执行时间
    android:fillBefore="true"                                         动画播放完后,视图是否会停留在动画开始的状态,默认为true
    android:fillAfter="false"                                         动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
    android:fillEnabled="true"                                        是否应用fillBefore值,对fillAfter值无影响,默认为true
    android:repeatMode="restart"                                      选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
    android:repeatCount="3"                                           重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
    android:interpolator="@android:interpolator/decelerate_quad"      插值器资源

    android:fromDegrees="float"                          浮点数。起始角度位置,以度为单位。
    android:toDegrees="float"                            浮点数。结束角度位置,以度为单位。
    android:pivotX="float"                               浮点数或百分比。旋转中心的 X 坐标。表示方式:相对于对象左边缘的像素数(例如 "5");相对于对象左边缘的百分比(例如 "5%");或相对于父级容器左边缘的百分比(例如 "5%p")。
    android:pivotY="float"  />

资源引用:
在 Java 中:R.anim.filename
在 XML 中:@[package:]anim/filename

3.2.2 使用方式

  1. Android 项目中新建 res/anim/ 目录。
  2. 新建一个动画的XML文件,该文件必须具有单个根元素:它可以是单个 、、、 或插值器元素,
    也可以是包含这些元素组的 元素(可能包含其他 )
    <set android:shareInterpolator="false">
        <scale
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:fromXScale="1.0"
            android:toXScale="1.4"
            android:fromYScale="1.0"
            android:toYScale="0.6"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fillAfter="false"
            android:duration="700" />
        <set android:interpolator="@android:anim/decelerate_interpolator">
            <scale
               android:fromXScale="1.4"
               android:toXScale="0.0"
               android:fromYScale="0.6"
               android:toYScale="0.0"
               android:pivotX="50%"
               android:pivotY="50%"
               android:startOffset="700"
               android:duration="400"
               android:fillBefore="false" />
            <rotate
               android:fromDegrees="0"
               android:toDegrees="-45"
               android:toYScale="0.0"
               android:pivotX="50%"
               android:pivotY="50%"
               android:startOffset="700"
               android:duration="400" />
        </set>
    </set>
    
  1. 代码引用,开始动画
    ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
    Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
    spaceshipImage.startAnimation(hyperspaceJumpAnimation);
    

3.2.3 我们也可以在java代码中直接使用

    Animation translateAnimation = new TranslateAnimation(0, 500, 0, 500);

    Animation alphaAnimation = new AlphaAnimation(...);
    
    Animation scaleAnimation = new ScaleAnimation(...);
    
    Animation rotateAnimation = new RotateAnimation(...);

    translateAnimation.setDuration(3000);
    // 固定属性的设置都是在其属性前加“set”,如setDuration()
    
    view.startAnimation(translateAnimation);

上面这些代码也可以通过set进行组合使用


    AnimationSet outSet = new AnimationSet(true);
    TranslateAnimation animOut = new TranslateAnimation(...);
    outSet.addAnimation(animOut);
    
    AlphaAnimation alphaAnimaOut = new AlphaAnimation(1f, 0f);
    outSet.addAnimation(alphaAnimaOut);
    outSet.setDuration(150L);
        
    view.startAnimation(outSet);

3.3 动画插值器

插值器是在 XML 中定义的一种影响动画变化速率的动画修改器,可让现有的动画效果加速、减速、重复、弹跳等。

插值器通过 android:interpolator 属性应用于动画元素,该属性的值是对插值器资源的引用。

包含有以下类型:

插值器类资源 ID描述
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator变化速率缓慢开始和结束,但在中间加速
AccelerateInterpolator@android:anim/accelerate_interpolator变化率开始缓慢然后加速的插值器
AnticipateInterpolator@android:anim/anticipate_interpolator开始向后然后向前猛冲
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator开始向后,然后向前猛冲并超过目标值,最后回到最终值
BounceInterpolator@android:anim/bounce_interpolator变化在最后反弹
CycleInterpolator@android:anim/cycle_interpolator将动画重复指定的周期数。变化率遵循正弦曲线模式
DecelerateInterpolator@android:anim/decelerate_interpolator其变化率开始时很快,然后减速
LinearInterpolator@android:anim/linear_interpolator变化率恒定的插值器
OvershootInterpolator@android:anim/overshoot_interpolator其中的变化向前猛冲并超过最后一个值,然后返回

自定义插值器

如果您对平台提供的插值器不满意,则可以使用修改过的属性创建自定义插值器资源,方式如下:

  1. Android 项目中新建 res/anim/ 目录。
  2. 新建一个动画的XML文件,
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"  差值器的名字, 实现的名称都以小写字母开头
    android:attribute_name="value"
    />
<accelerateDecelerateInterpolator>
    变化率在开始和结束时缓慢,但在中间会加快。
    无属性。

<accelerateInterpolator>
    变化率在开始时较为缓慢,然后会加快。
    属性:
    android:factor
        浮点数。加速率。默认值为 1。
        
<anticipateInterpolator>
    先反向变化,然后再急速正向变化。
    属性:
    android:tension
        浮点数。要应用的张力。默认值为 2。

<anticipateOvershootInterpolator>
    先反向变化,再急速正向变化并超过目标值,然后以最终值结束。
    属性:
    android:tension
        浮点数。要应用的张力。默认值为 2。
    android:extraTension
        浮点数。张力要乘以的倍数。默认值为 1.5。

<bounceInterpolator>
    变化会在结束时弹跳。
    无属性。

<cycleInterpolator>
    按指定的循环次数重复动画。变化率符合正弦曲线图。
    属性:
    android:cycles
        整数。循环次数。默认值为 1。

<decelerateInterpolator>
    变化率开始时很快,然后减速。
    属性:
    android:factor
        浮点数。减速率。默认值为 1。

<linearInterpolator>
    变化率恒定不变。
    无属性。

<overshootInterpolator>
    先急速正向变化,再超过最终值,然后回到最终值。
    属性:
    android:tension
        浮点数。要应用的张力。默认值为 2。

如:

<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:tension="7.0"
    />

3.4 属性动画

在 XML 中定义的动画,用于在设定的一段时间内修改目标对象的属性,例如背景颜色或 alpha 值。

其对应的java类 ValueAnimator、ObjectAnimator 或 AnimatorSet

xml中定义属性动画

  1. 新建目录及文件 res/animator/filename.xml

语法如下:

<set
  android:ordering=["together" | "sequentially"]>     指定此集合中动画的播放顺序,  sequentially	依序播放此集合中的动画。 together(默认)	同时播放此集合中的动画。

    <objectAnimator
        android:propertyName="string"                     要添加动画效果的对象的属性,如"alpha" 或 "backgroundColor"
        android:duration="int"                            整数。动画的时间,以毫秒为单位。默认为 300 毫秒。
        android:valueFrom="float | int | color"           浮点数、整数或颜色。动画属性的起始值。如果未指定,则动画将从属性的 get 方法获得的值开始。颜色以六位十六进制数字表示,例如 #333333。
        android:valueTo="float | int | color"             浮点数、整数或颜色。必需。动画属性的结束值。颜色以六位十六进制数字表示,例如 #333333
        android:startOffset="int"                         整数。调用 start() 后动画延迟的毫秒数
        android:repeatCount="int"                         整数。动画的重复次数。设为 "-1" 表示无限次重复,也可设为正整数。例如,值 "1" 表示动画在初次播放后重复播放一次,因此动画总共播放两次。默认值为 "0",表示不重复。
        android:repeatMode=["restart" | "reverse"]        整数。动画播放到结尾处的行为。android:repeatCount 必须设置为正整数或 "-1",该属性才有效。设置为 "reverse" 可让动画在每次迭代时反向播放,设置为 "restart" 则可让动画每次从头开始循环播放。
        android:valueType=["intType" | "floatType"]/>     如果值为颜色,则不要指定此属性。动画框架会自动处理颜色值。  intType	指定动画值为整数。    floatType(默认)	指定动画值为浮点数。

    <animator
        android:duration="int"                            整数。动画的时间,以毫秒为单位。默认为 300 毫秒。
        android:valueFrom="float | int | color"           浮点数、整数或颜色。必需。动画的起始值。颜色以六位十六进制数字表示,例如 #333333。
        android:valueTo="float | int | color"             浮点数、整数或颜色。必需。动画的结束值。颜色以六位十六进制数字表示,例如 #333333。
        android:startOffset="int"                         整数。调用 start() 后动画延迟的毫秒数。
        android:repeatCount="int"
        android:repeatMode=["restart" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>

其实也可以不用 set包裹,定义单一的动画

<objectAnimator
    android:propertyName="string"
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["restart" | "reverse"]
    android:valueType=["intType" | "floatType"]/>

<animator
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["restart" | "reverse"]
    android:valueType=["intType" | "floatType"]/>

  1. 资源引用:
    在 Java 或 Kotlin 代码中:R.animator.filename
    在 XML 中:@[package:]animator/filename

我们举例:
定义xml动画,然后在代码中调用开始动画。

<set android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="intType"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="intType"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1f"/>
</set>

开始动画

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.animator.property_animator);
set.setTarget(myObject);            // 必须操作
set.start();

代码中定义属性动画

    ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f);
    animation.setDuration(1000);
    animation.start();
    
    
    ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, "alpha", 0.3f, 1f);
    objectAnimator1.setDuration(1000);
    objectAnimator1.setRepeatCount(ValueAnimator.INFINITE);
    objectAnimator1.setRepeatMode(ValueAnimator.REVERSE);

    ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(view, "rotation", 0.0F, 360f);
    objectAnimator2.setDuration(5000);
    objectAnimator2.setRepeatCount(ValueAnimator.INFINITE);
    
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.setInterpolator(new LinearInterpolator());
    animatorSet.playTogether(objectAnimator1, objectAnimator2);
    animatorSet.start();

这块东西比较多,由于篇幅原因,我们另起一篇。

属性动画

四、属性动画与视图动画的区别

1、 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 view 对象添加动画效果,则必须实现自己的代码才能做到。
视图动画系统也存在一些限制,因为它仅公开view 对象的部分方面来供您添加动画效果;例如,您可以对视图的缩放和旋转添加动画效果,但无法对背景颜色这样做

2、 视图动画系统的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,如果您为某个按钮添加了动画效果,使其可以在屏幕上移动,该按钮会正确绘制,
但能够点击按钮的实际位置并不会更改,因此您必须通过实现自己的逻辑来处理此事件。

动画

五、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux线程的设计

文章目录 一.理解Linux线程的本质进程地址空间是进程访问系统资源的窗口Linux系统中,线程是比进程更轻量级的执行流 二.Linux线程独立运行的原理三.基础线程控制 一.理解Linux线程的本质 进程地址空间是进程访问系统资源的窗口 Linux系统中,线程是比进程更轻量级的执行流 线程…

IIS如何本地部署网站,作为局域网内的服务器

文章目录 IIS本地部署WebService1.使用IIS及WebService的原因:2.相关文件说明及网络条件说明&#xff1a;&#xff08;1&#xff09;文件说明&#xff1a;&#xff08;2&#xff09;网络条件说明&#xff1a; 3.IIS安装与配置&#xff1a;第一步&#xff1a;安装第二步&#xf…

全国职业院校技能大赛“大数据应用开发”赛项说明

1、赛项介绍 &#xff08;1&#xff09;赛项名称 全 国 职 业 院 校 技 能 大 赛 “大数据应用开发” 赛 项 职业院校技能大赛官网 (vcsc.org.cn)https://www.vcsc.org.cn/ 大赛组织机构介绍 全国职业院校技能大赛(以下简称大…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…

网络攻击1——网络安全基本概念与终端安全介绍(僵尸网路、勒索病毒、木马植入、0day漏洞)

目录 网络安全的基本术语 黑客攻击路径 终端安全 僵尸网络 勒索病毒 挖矿病毒 宏病毒 木马的植入 0day漏洞 流氓/间谍软件 网络安全的基本术语 网络安全的定义&#xff08;CIA原则&#xff09; 数据的保密性Confidentiality&#xff08;对称/非对称秘钥&#xff09; …

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法&#xff0c; 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

C语言-Makefile

Makefile 什么是make&#xff1f; make 是个命令&#xff0c;是个可执行程序&#xff0c;用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件&#xff0c;这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候&#xff0c; m…

[DroneCAN]CAN-Convertor控制CAN电调电机

简介 CAN电调电机是一类通过CAN协议控制转速的电调电机&#xff0c;和传统的PWM电调电机不同在于&#xff0c;CAN协议有网络性和抗干扰性&#xff0c;因此其性能比PWM更好&#xff0c;占用的端口数也会更少。在apm或者px4等基于dronecan的飞控来说&#xff0c;想要控制第三方的…

【CMU 15-445】Lecture 10: Sorting Aggregations Algorithms 学习笔记

Sorting & Aggregations Algorithms SortingTop-N Heap SortExternal Merge Sort2-WAY External Merge SortK-WAY External Merge SortDouble Buffering Optimization AggregationsSortingHashing 本节课主要介绍的是数据库系统中的排序算法以及聚合算法 Sorting 排序算法…

大模型自定义算子优化方案学习笔记:CUDA算子定义、算子编译、正反向梯度实现

01算子优化的意义 随着大模型应用的普及以及算力紧缺&#xff0c;下一步对于计算性能的追求一定是技术的核心方向。因为目前大模型的计算逻辑是由一个个独立的算子或者说OP正反向求导实现的&#xff0c;底层往往调用的是GPU提供的CUDA的驱动程序。如果不能对于整个计算过程学习…

LearnDash LMS ProPanel在线学习系统课程创作者的分析工具

点击阅读LearnDash LMS ProPanel在线学习系统课程创作者的分析工具原文 LearnDash LMS ProPanel在线学习系统课程创作者的分析工具通过整合报告和作业管理来增强您的 LearnDash 管理体验&#xff0c;使您能够发送特定于课程的通信&#xff0c;并显示课程的实时活动&#xff01…

分类信息网商业运营版源码系统:适合各类行业分类站点建站 带安装部署教程

随着互联网的快速发展&#xff0c;信息分类网站在各个行业中得到了广泛应用。为了满足不同行业的需求&#xff0c;罗峰给大家分享一款适合各类行业分类站点建站的商业运营版源码系统。该系统旨在提供一套完整的解决方案&#xff0c;帮助用户快速搭建自己的分类信息网站&#xf…

【最新版】在WSL上运行 Linux GUI (图形用户界面)应用(Gnome 文本编辑器、GIMP、Nautilus、VLC、X11 应用)

文章目录 一、 安装WSL0. 先决条件1. 全新安装2. 现有 WSL 安装3. 注意事项 二、运行 Linux GUI 应用1. 更新发行版中的包2. 安装 Gnome 文本编辑器启动 3. 安装 GIMP启动 4. 安装 Nautilus启动 5. 安装 VLC启动 6. 安装 X11 应用 适用于 Linux 的 Windows 子系统 (WSL) 现在支…

Javaweb考前复习冲刺(不断更新版)

Javaweb考前复习冲刺 第一章&#xff1a; JavaWeb 入门 JavaWeb是指&#xff1a;以Java作为后台语言的项目工程。 javaweb项目创建的过程&#xff1a; 首先集成Tomcat服务器环境新建dynamic web project部署工程运行 路由含义&#xff1a; ​ http://localhost:8080/工程…

Redis 主从集群 —— 超详细操作演示!

五、Redis 主从集群 五、Redis 主从集群5.1 主从集群搭建5.1.1、伪集群搭建与配置5.1.2、分级管理5.1.3、容灾冷处理 5.2 主从复制原理5.2.1、主从复制原理5.2.2、数据同步演变过程 5.3 哨兵机制实现5.3.1 简介5.3.2 Redis高可用集群搭建5.3.3 Redis高可用集群的启动5.3.4 Sent…

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…

Java并发(十九)----Monitor原理及Synchronized原理

1、Java 对象头 以 32 位虚拟机为例 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark W…

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功&#xff0c;尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

pytorch和pytorchvision安装

参考https://blog.csdn.net/2301_76863102/article/details/129369549 https://blog.csdn.net/weixin_43798572/article/details/123122477 查看我的版本 右键&#xff0c;nvivdia控制面板&#xff0c;帮助&#xff0c;系统信息 驱动程序版本号为528.49 更新很快的 CUDA版本…

stm32F4——BEEP与按键的实例使用

stm32F4——BEEP与按键的实例使用 蜂鸣器和按键的实质都是GPIO的使用&#xff0c;所以基本原理就不介绍啦&#xff0c;基本寄存器其实都是GPIO的高低电平的赋值&#xff0c;可以参考stm32——LEDGPIO的详细介绍 文章目录 stm32F4——BEEP与按键的实例使用一、BEEP二、 KEY三、通…