刘学习

导航

 
  • 1. 属性动画什么?
  • 2. 对图片实现跳跃加载动画
    • 2.1 需求
    • 2.2 实现思路
    • 2.3 图片动画的实现
    • 2.4 注意
  • 3. 对文字实现加载动画
    • 3.1 需求
    • 3.2 代码
    • 3.3 问题
  • 4. 取消动画
  • 5. 吐槽

 

在这里插入图片描述

1. 属性动画什么?

属性动画能够只针对控件的某一个属性来做动画,它能单独改变控件某一个属性的值,比如颜色。
属性动画能实现补间动画无法实现的功能。
视图动画仅能对指定的控件做动画, 而属性动画是通过改变控件的某一属性值来做动画的。

2. 对图片实现跳跃加载动画

2.1 需求

  1. 动画执行动画,上升下降;
  2. 一次循环结束更换图片信息;

2.2 实现思路

  1. 创建一个类继承自ImageView 类,这样方便地更改它的源文件内容。
  2. 要想实现上下移动的效果,可利用 ValueAnimator 实时产生 0~ 100 的数值,通过设置监听让当前图片的位置实时向上移动。

2.3 图片动画的实现

源码都在这里了。

 1 public class LoadingImageView extends androidx.appcompat.widget.AppCompatImageView {
 2     //用于实时
 3     private int mTop;
 4     private ValueAnimator animator;
 5 
 6     private int curImgIndex = 0;
 7     private int mImageCount = 7;
 8 
 9     public LoadingImageView(Context context, @Nullable AttributeSet attrs) {
10         super(context, attrs);
11         init();
12     }
13 
14     private void init() {
15         animator = ValueAnimator.ofInt(0, 100, 0);
16         animator.setDuration(1000);
17         animator.setRepeatMode(ValueAnimator.RESTART);
18         animator.setRepeatCount(ValueAnimator.INFINITE);
19         animator.setInterpolator(new AccelerateDecelerateInterpolator());
20 
21         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
22             @Override
23             public void onAnimationUpdate(ValueAnimator animation) {
24                 Integer dy = (Integer) animation.getAnimatedValue();
25                 setTop(mTop - dy);
26             }
27         });
28 
29         animator.addListener(new Animator.AnimatorListener() {
30             @Override
31             public void onAnimationStart(Animator animation) {
32                 setImageDrawable(getResources().getDrawable(R.drawable.channel2));
33             }
34 
35             @Override
36             public void onAnimationEnd(Animator animation) {
37 
38             }
39 
40             @Override
41             public void onAnimationCancel(Animator animation) {
42 
43             }
44 
45             @Override
46             public void onAnimationRepeat(Animator animation) {
47                 //每重复一次就更换一次图片 放在 这个方法中写。
48                 curImgIndex++;
49                 int i = curImgIndex % mImageCount + 1 ;
50                 //通过文件名拿到对应的资源ID;当循环到第7张,7 % 7 = 0;没有匹配的图片。故统一向前加 1
51                 int id = getResources().getIdentifier("channel" + i, "drawable", "com.example.customview");
52                 Log.i("TAG", "image id is : " + id);
53                 Drawable drawable = getResources().getDrawable(id);
54                 setImageDrawable(drawable);
55             }
56         });
57         animator.start();
58     }
59 
60     @Override
61     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
62         super.onLayout(changed, left, top, right, bottom);
63         mTop = top;
64     }
65 }

 

2.4 注意

  1. 这里 通过文件名拿到对应的资源ID,动态加载图片;

  2. 当循环到第 7 张图片,7 % 7 = 0;没有匹配的图片。故统一向前加 1;

  3. 这里的参数是:getIdentifier(filename,filetype,packagename);

    1 int id = getResources().getIdentifier("channel" + i, "drawable", "com.example.customview");
    2 Drawable drawable = getResources().getDrawable(id);
    3 setImageDrawable(drawable);

     

3. 对文字实现加载动画

3.1 需求

实现如图所示,"加载中…" 一个一个蹦出来的动画效果

3.2 代码

 1 private void loadingTv() {
 2     //这里并没有实时监听他的动作。
 3     mValueAnimator = ValueAnimator.ofInt(0, 3);
 4     mValueAnimator.setDuration(1000);
 5     mValueAnimator.setRepeatCount(ValueAnimator.INFINITE);
 6     mValueAnimator.addListener(new Animator.AnimatorListener() {
 7         @Override
 8         public void onAnimationStart(Animator animation) {
 9         }
10         @Override
11         public void onAnimationEnd(Animator animation) {
12         }
13         @Override
14         public void onAnimationCancel(Animator animation) {
15         }
16         @Override
17         public void onAnimationRepeat(Animator animation) {
18             times++;
19             switch (times % 4) {
20                 case 2:
21                     tv_loading.setText("加");
22                     break;
23                 case 3:
24                     tv_loading.append("载");
25                     break;
26                 case 0:
27                     tv_loading.append("中");
28                     break;
29                 case 1:
30                     tv_loading.append("…");
31                     break;
32                 default:
33                     break;
34             }
35         }
36     });
37     mValueAnimator.start();
38 }

 

3.3 问题

这绝不是最好的办法,因为反反复复的刷新 UI 必然会造成内存浪费,更好的办法会继续更新。

4. 取消动画

切记:对于执行了无限重复的动画,在 activity 销毁之前一定要执行 cancel。

1 if (rotateAnimation != null) {
2     rotateAnimation.cancel();
3 }
4 mValueAnimator.cancel();

 

5. 吐槽

  1. 做动画遇到的问题:重复更新 UI 或者图片,都是在 onAnimationRepeat() 中执行的;
  2. 做动画的过程中遇到的问题,Java 半小时,动画八小时……
  3. 如何将手机录屏的竖屏视频截取一段横屏?
    1. 打开 PR 导入素材,并拖至时间轴,如果你不需要声音,可以点击时间轴中,下面一条右键选中 “取消链接” ,随后即可 delete 删除下边的音频;
    2. 此时,视频是竖直的,点击顶部,序列 - 序列设置 - 帧大小;将横竖参数进行修改,
      在这里插入图片描述
    3. 截取视频;双击右上角视频区,选择效果,打开右边栏 - 视频效果 - 变换 - 剪裁 - 在左边栏进行尺寸剪裁以及放大操作。
    4. 如果视频不是很~讲究,导出时不必搞得像素很高,那会导致文件很大。
posted on 2020-07-16 06:46  刘学习  阅读(235)  评论(0)    收藏  举报