我是靠谱客的博主 善良故事,这篇文章主要介绍自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged),现在分享给大家,希望可以做个参考。

转载请注明出处:王亟亟的大牛之路

之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果。那么自定义的View当然也有动态的效果也就是我们的Animation,常用的有三种

View Animation
Drawable Animation
Property Animation

这一篇讲一下简单的Drawable Animation。

Drawable Animation实现好是什么个样子呢?

帧动画,一张一张的图片,一次播形成动画的景象。

这里写图片描述

效果就是如此,把一帧一帧的图品相机播放,形成动画的效果。

Who to do?

简单的看你可以用handle然后诸如runOnUIThread来做这些事,但是view既然提供了这样的实现,那为什么不用呢?

首先,定义一个动画的xml(java代码运行,这里以XML声称为例),并且放在drable目录下

这里写图片描述

这里用的是back和positive做正放,倒放的事。

然后定义一下具体播放的图片内容以及持续时间

下面以倒播为例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/draw9" android:duration="500"/> <item android:drawable="@drawable/draw8" android:duration="500"/> <item android:drawable="@drawable/draw7" android:duration="500"/> <item android:drawable="@drawable/draw6" android:duration="500"/> <item android:drawable="@drawable/draw5" android:duration="500"/> <item android:drawable="@drawable/draw4" android:duration="500"/> <item android:drawable="@drawable/draw3" android:duration="500"/> <item android:drawable="@drawable/draw2" android:duration="500"/> <item android:drawable="@drawable/draw1" android:duration="500"/> </animation-list>

再之后用按钮把动画开启,结束就OK了 十分简单

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override public void onClick(View v) { int flag = v.getId(); anim = (AnimationDrawable) animImageView.getDrawable(); switch (flag) { case R.id.startAnim: animImageView.setImageResource(R.drawable.positive_anim); anim.start(); break; case R.id.toppleAnim: animImageView.setImageResource(R.drawable.back_anim); anim.start(); break; case R.id.stopAnim: anim.stop(); break; } }

顺道再讲讲onWindowFocusChanged,在之前测绘图片大小的时候已经看到了他的身影,那么他是具体做什么的呢?

其实在我们Activity执行的初期像onStart, onResume, onCreate其实我们的整个页面并没有完成渲染,所以这也就是我们为什么无法获取控件的长宽。

当你的Activity一获得就会调用这个方法

复制代码
1
2
3
4
5
6
@Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); }

我们知道onResume也是Activity获取屏幕焦点时会被调用,那么2者又有什什么区别呢?

我们通过实验,用代码的Log来解释二者的区别

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override protected void onResume() { super.onResume(); Log.d("--->onResume", "onResume"); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("-->onWindowFocusChanged", "--->AnimActivity onWindowFocusChanged"); if (hasFocus) { anim.start(); } } @Override protected void onPause() { super.onPause(); Log.d("--->onPause", "onPause"); }

进入Activity时

复制代码
1
2
01-04 16:57:24.131 5129-5129/paintcanvasdemo.pro.wjj.paintcanvasdemo D/--->onResume: onResume 01-04 16:57:24.161 5129-5129/paintcanvasdemo.pro.wjj.paintcanvasdemo D/-->>onWindowFocusChanged: --->AnimActivity onWindowFocusChanged

Home退出时

复制代码
1
2
01-04 16:58:33.581 5129-5129/paintcanvasdemo.pro.wjj.paintcanvasdemo D/--->onPause: onPause 01-04 16:58:33.601 5129-5129/paintcanvasdemo.pro.wjj.paintcanvasdemo D/-->>onWindowFocusChanged: --->AnimActivity onWindowFocusChanged

当然,其中还参杂着onStop,onRestart,onStart。但是只要我们的Activity产生了焦点层面的变化他都可以监听到,关键是,他已经做100%交互式的逻辑了,而部分内容在onResume这里还无法做到(没有完全渲染结束)。

源码地址:https://github.com/ddwhan0123/BlogSample/tree/master/PaintCanvasDemo

这里写图片描述

记得点个赞哦!

最后

以上就是善良故事最近收集整理的关于自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged)的全部内容,更多相关自定义View时,用到Paint内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部