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

属性动画能够只针对控件的某一个属性来做动画,它能单独改变控件某一个属性的值,比如颜色。
属性动画能实现补间动画无法实现的功能。
视图动画仅能对指定的控件做动画, 而属性动画是通过改变控件的某一属性值来做动画的。
- 动画执行动画,上升下降;
- 一次循环结束更换图片信息;
- 创建一个类继承自ImageView 类,这样方便地更改它的源文件内容。
- 要想实现上下移动的效果,可利用 ValueAnimator 实时产生 0~ 100 的数值,通过设置监听让当前图片的位置实时向上移动。
源码都在这里了。
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 }
-
这里 通过文件名拿到对应的资源ID,动态加载图片;
-
当循环到第 7 张图片,7 % 7 = 0;没有匹配的图片。故统一向前加 1;
-
这里的参数是:
getIdentifier(filename,filetype,packagename);1 int id = getResources().getIdentifier("channel" + i, "drawable", "com.example.customview"); 2 Drawable drawable = getResources().getDrawable(id); 3 setImageDrawable(drawable);
实现如图所示,"加载中…" 一个一个蹦出来的动画效果
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 }
这绝不是最好的办法,因为反反复复的刷新 UI 必然会造成内存浪费,更好的办法会继续更新。
切记:对于执行了无限重复的动画,在 activity 销毁之前一定要执行 cancel。
1 if (rotateAnimation != null) { 2 rotateAnimation.cancel(); 3 } 4 mValueAnimator.cancel();
- 做动画遇到的问题:重复更新 UI 或者图片,都是在
onAnimationRepeat()中执行的; - 做动画的过程中遇到的问题,Java 半小时,动画八小时……
- 如何将手机录屏的竖屏视频截取一段横屏?
- 打开 PR 导入素材,并拖至时间轴,如果你不需要声音,可以点击时间轴中,下面一条右键选中 “取消链接” ,随后即可 delete 删除下边的音频;
- 此时,视频是竖直的,点击顶部,序列 - 序列设置 - 帧大小;将横竖参数进行修改,
![在这里插入图片描述]()
- 截取视频;双击右上角视频区,选择效果,打开右边栏 - 视频效果 - 变换 - 剪裁 - 在左边栏进行尺寸剪裁以及放大操作。
- 如果视频不是很~讲究,导出时不必搞得像素很高,那会导致文件很大。

浙公网安备 33010602011771号