Android 应用基础技术14_第1页
Android 应用基础技术14_第2页
Android 应用基础技术14_第3页
Android 应用基础技术14_第4页
Android 应用基础技术14_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章动画Android支持两种类型的动画类型:属性动画和View动画。View动画又分为补间动画(Tween动画)和帧动画(Frame动画或AnimationDrawable动画)。动画的基本原理是在一个特定的时间内将组件的某个属性从一个值变化到一个新的值,或者将整个组件的显示状态从一种状态变化到一种新的状态。View动画是最常用的动画,因此,在本章对View动画进行介绍。目录9.1View动画之补间动画基础9.2View动画之帧动画9.3课堂同步练习9.1View动画之补间动画基础先看看View动画的补间动画。通过一个简单的例子,对补间动画有一个初步认识后,再介绍补间动画的详细内容。9.1.1补间动画举例所谓补间动画就是在一个特定的时间内,按一定的速度将组件从一个位置移动到另一个位置、从一个角度旋转到另一个角度、显示透明度从一个值变换到另一个值、大小从一个尺度变换到另一个尺度。不仅如此,Android还允许将以上4种操作合并在一个动画中执行。先看一个简单的例子,这个例子将一个TextView组件在4秒内以它的左下角为重心从0度顺时针旋转到90度,并且旋转的速度越来越快。运行效果如图所示,期间,TextView组件持续旋转,直到4秒后完成动画并显示最终结果。新建一个名为ch0901的工程,并修改主布局文件res/layout/activity_main.xml为如下代码内容:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">

<TextViewandroid:id="@+id/id_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world"/>

</LinearLayout>为了使TextView显示更多的文字,修改res/values/strings.xml文件内容为如下内容:<resources><stringname="app_name">ch0901</string>

<stringname="hello_world">补间动画是对组件本身进行动画,包括在一个特定的

时间内对组件进行移动、旋转、透明度变化、缩放,还可以在

一个动画中对以上4种动画进行任意的组合。这是一个补间动画

的旋转的例子的运行效果 </string>

</resources>与定义布局一样,Android提供了两种定义动画的方式:通过XML文件定义动画和通过Java代码定义动画。Android建议使用XML文件定义动画方式,并且View动画定义的文件必须放置在res/anim工程目录下。为此,在工程的res目录下创建anim目录,并在其目录下创建一个名为my_rotate.xml的动画文件。修改my_rotate.xml动画文件的内容为如下内容:<?xmlversion="1.0"encoding="utf-8"?><rotatexmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator"android:fromDegrees="0"android:toDegrees="90"android:pivotX="0%"android:pivotY="100%"android:duration="4000"android:fillAfter="true"></rotate>定义好动画文件后,接下来需要修改MainActivity.java文件,使TextView可以被动画处理,修改后的MainActivity.java文件内容如下:packagecom.example.ch0901;

importandroid.os.Bundle;importandroid.view.animation.Animation;importandroid.view.animation.AnimationUtils;importandroid.widget.TextView;

importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;

publicclassMainActivityextendsAppCompatActivity{

@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});

TextViewtv=findViewById(R.id.id_tv);Animationrotate=AnimationUtils.loadAnimation(this,R.anim.my_rotate);tv.startAnimation(rotate);

}}9.1.2补间动画类型补间动画共包括4种动画形式,它们分别是:旋转动画、缩放动画、透明度动画和移位动画,标签分别为<rotate>、<scale>、<alpha>和<translate>。定义的补间动画的文件必须放置在res/anim工程目录下,文件名称可以是任何合法的名称,在程序中引用动画资源时,采用R.anim.filename的方式来引用,在XML文件中采用@[package:]anim/filename的方式来引用动画资源。1、定义rotate旋转动画<?xmlversion="1.0"encoding="utf-8"?><rotatexmlns:android="/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"android:fromDegrees="float"android:toDegrees="float"android:pivotX="float"android:pivotY="float"android:startOffset="int"android:duration="int"android:fillAfter="boolean"android:repeatCount="int"android:repeatMode="restart|reverse"></rotate>2、定义scale缩放动画<?xmlversion="1.0"encoding="utf-8"?><scalexmlns:android="/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"android:fromXScale="float"android:toXScale="float"android:fromYScale="float"android:toYScale="float"android:pivotX="float"android:pivotY="float"android:startOffset="int"android:duration="int"android:fillAfter="boolean"android:repeatCount="int"android:repeatMode="restart|reverse"></scale>3、定义alpha透明度动画<?xmlversion="1.0"encoding="utf-8"?><alphaxmlns:android="/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"android:fromAlpha="float"android:toAlpha="float"android:startOffset="int"android:duration="int"android:fillAfter="boolean"android:repeatCount="int"android:repeatMode="restart|reverse"></alpha>4、定义translate移位动画<?xmlversion="1.0"encoding="utf-8"?><translatexmlns:android="/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"android:fromXDelta="float"android:fromYDelta="float"android:toXDelta="float"android:toYDelta="float"android:startOffset="int"android:duration="int"android:fillAfter="boolean"android:repeatCount="int"android:repeatMode="restart|reverse"></translate>5、定义复合set动画<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"android:interpolator="@[package:]anim/interpolator_resource"android:shareInterpolator=["true"|"false"]><rotate……/><translate……/>

……<set……>……</set></set>9.1.3使用动画监听器有时,需要监听动画的执行过程,为此,可以使用Animation.AnimationListener动画监听器接口来监听动画执行的各个阶段。AnimationListener接口有3个方法分别用于监听动画的三个阶段:开始,onAnimationStart;结束,onAnimationEnd;重复,onAnimationRepeat。修改上一节的旋转TextView的动画例子,动画结束时使用Toast显示一个结束消息。为此,只需要修改MainActivity.java程序的onCreate()回调函数,修改后代码如下:packagecom.example.ch0901;

importandroid.os.Bundle;importandroid.view.animation.Animation;importandroid.view.animation.AnimationUtils;importandroid.widget.TextView;importandroid.widget.Toast;

importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;

publicclassMainActivityextendsAppCompatActivity{

@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});

TextViewtv=(TextView)findViewById(R.id.id_tv);Animationrotate=AnimationUtils.loadAnimation(this,R.anim.my_rotate);rotate.setAnimationListener(newAnimation.AnimationListener(){

@OverridepublicvoidonAnimationStart(Animationanimation){}

@OverridepublicvoidonAnimationEnd(Animationanimation){Toast.makeText(MainActivity.this,"动画结束",Toast.LENGTH_LONG).show();;}

@OverridepublicvoidonAnimationRepeat(Animationanimation){}

});tv.startAnimation(rotate);

}}9.2View动画之帧动画帧动画就是按一定的时间顺序显示一组预定义的图片。采用XML文件定义帧动画时,需要将定义文件放置在res/drawable工程目录下,文件名可以是任意合法的文件名。在XML或在Java程序中引用帧动画资源与引用一般图片资源的形式是一样的,可以在任何可以使用drawable资源的地方使用帧动画资源。定义帧动画的一般格式如下:<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="/apk/res/android"android:oneshot=["true"|"false"]><itemandroid:drawable="@[package:]drawable/drawable_resource_name“android:duration="integer"/><item……/>

……</animation-list>下面通过一个简单的例子来说明如何在程序中使用帧动画。该例子将以每张图片显示100毫秒的时间顺序显示如图所示的图片从而产生动画效果。运行结果如图所示。新建一个名为ch0902的工程。在res/mipmap目录下放置如图9-3所示的图片,并在res/drawable工程目录下新建一个名为image_rotate.xml的帧动画资源文件,修改其内容为如下代码:<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="/apk/res/android"android:oneshot="false"><itemandroid:drawable="@mipmap/r0"android:duration="100"/><itemandroid:drawable="@mipmap/r1"android:duration="100"/></animation-list>修改主布局activity_main.xml文件,该布局在LinearLayout中显示一个ImageView组件和两个按钮,修改后的文件内容如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">

<ImageViewandroid:id="@+id/id_iamge_view"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"android:scaleType="center"android:src="@drawable/image_rotate"/>

<Buttonandroid:id="@+id/id_button_1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:text="@string/text_start"/>

<Buttonandroid:id="@+id/id_button_2"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:text="@string/text_stop"/>

</LinearLayout>需要修改res/values/strings.xml文件,在其中定义在布局文件中用到的字符串引用,内容如下:<resources><stringname="app_name">ch0902</string>

<stringname="text_start">开始</string><stringname="text_stop">停止</string>

</resources>最后修改MainActivity.java文件,在点击按钮时启动或停止动画,修改后的文件内容如下:packagecom.example.ch0902;

importandroid.graphics.drawable.AnimationDrawable;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;

importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{

@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);V

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论