安卓动画学习(较浅显)
Posted 春招进大厂的梦想家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓动画学习(较浅显)相关的知识,希望对你有一定的参考价值。
安卓动画
一、逐帧动画
1.定义:把几张图片进行快速的播放就是逐帧动画
下面演示的demo是触碰图片进行动画的播放
2.添加几张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fffY5nI7-1623229374008)(C:\\Users\\23737\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210609154726838.png)]
3.在drawable文件下面添加一个frame.xml文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/one" android:duration="120"/>
<item android:drawable="@drawable/two" android:duration="120"/>
<item android:drawable="@drawable/three" android:duration="120"/>
<item android:drawable="@drawable/four" android:duration="120"/>
<item android:drawable="@drawable/five" android:duration="120"/>
</animation-list>
4.把主活动的xml修改了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/Animation"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/frame"
tools:context=".AnimationActivity">
</RelativeLayout>
把刚才创建的frame.xml文件当做背景导入主活动
5.在java文件下进行动画的展示
public class AnimationActivity extends AppCompatActivity {
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
//获得动画的Drawable资源
RelativeLayout relativeLayout = findViewById(R.id.Animation);
AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag) {
//启动动画
anim.start();
flag = false;
}else {
//停止动画
anim.stop();
flag = true;
}
}
});
}
}
首先呢需要设置一个标志位,标志图片是否遍历完成
接着就是找到控件,得到背景,设置点击事件,启动动画/结束动画
二、补间动画
补间动画:给动画设置初始值和结束值,设置一个变化时间,安卓系统会自动将动画补全。
分类:
- alpha:透明度
- rotate:旋转
- scale:缩放
- translate:平移
1.首先先在res文件下创一个anim文件夹
2.在anim文件下创一个xml文件,命名为alpha
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:duration="2000"
android:fromAlpha="0" android:toAlpha="1" />
</set>
3.在主活动的xml文件下进行修改
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".tweenAnimation">
<ImageView
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv"
android:maxWidth="300dp"
android:maxHeight="300dp"
android:adjustViewBounds="true"
android:src="@drawable/ceshi"/>
</RelativeLayout>
4.在主活动的java文件下修改代码
public class tweenAnimation extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween_animation);
ImageView imageView = findViewById(R.id.iv);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过加载xml动画设置文件来创建一个Animation对象
Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.alpha);
//开启动画
imageView.startAnimation(animation);
}
});
}
}
通过设置不同的操作类型来实现不同的效果。
例如平移、缩放、旋转等
旋转
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate android:duration="2000"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"/>
</set>
平移
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="400"
android:toYDelta="400"
android:duration="2000"/>
</set>
缩放
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:duration = "2000"
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="0.5"
android:toYScale="0.5"
android:pivotY="50%"
android:pivotX="50%"/>
</set>
然后在java文件下修改就好了
public class tweenAnimation extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween_animation);
ImageView imageView = findViewById(R.id.iv);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过加载xml动画设置文件来创建一个Animation对象
//透明度
// Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.alpha);
// imageView.startAnimation(animation);
//缩放
// Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.scale);
// imageView.startAnimation(animation);
//平移
// Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.translate);
// imageView.startAnimation(animation);
//旋转
Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.rotate);
imageView.startAnimation(animation);
}
});
}
}
三、属性动画
1.ValueAnimator
//属性动画
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,1f);
valueAnimator.setDuration(2000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
}
});
valueAnimator.start();
2.ObjectAnimator
TextView textView = findViewById(R.id.text_animation);
//ObjectAnimator使得text的透明度由完全透明变成完全不透明
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"alpha",0f,1f);
objectAnimator.setDuration(4000);
objectAnimator.start();
3.监听器
//监听器
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
//动画开始的时候调用
public void onAnimationStart(Animator animation) {
}
@Override
//动画结束的时候调用
public void onAnimationEnd(Animator animation) {
}
@Override
//动画被取消的时候调用
public void onAnimationCancel(Animator animation) {
}
@Override
//动画重复执行的时候调用
public void onAnimationRepeat(Animator animation) {
}
});
全部代码
public class tweenAnimation extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween_animation);
//属性动画
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,1f);
valueAnimator.setDuration(2000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
}
});
valueAnimator.start();
TextView textView = findViewById(R.id.text_animation);
//ObjectAnimator使得text的透明度由完全透明变成完全不透明
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"alpha",0f,1f);
objectAnimator.setDuration(4000);
objectAnimator.start();
//监听器
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
//动画开始的时候调用
public void onAnimationStart(Animator animation) {
}
@Override
//动画结束的时候调用
public void onAnimationEnd(Animator animation) {
}
@Override
//动画被取消的时候调用
public void onAnimationCancel(Animator animation) {
}
@Override
//动画重复执行的时候调用
public void onAnimationRepeat(Animator animation) {
}
});
}
四、拓展:单位和尺寸
一、px和pt的区别
1.px
px: pixels(像素),不同设备的显示效果相同
2.pt
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单实用
二、dp和sp的作用
1.dp
dp(dip): device independent pixels(设备独立像素),不同的设备会有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
2.sp
sp:scaled pixels(放大像素),主要用于字体显示best for textsize
三、LayoutParams
LayoutParams相当于是一个Layout的信息包,封装了layout的位置、宽高等信息.
以上是关于安卓动画学习(较浅显)的主要内容,如果未能解决你的问题,请参考以下文章