自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged)
2017-08-16 14:03
411 查看
转载请注明出处:王亟亟的大牛之路
之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果。那么自己定义的View当然也有动态的效果也就是我们的Animation。经常使用的有三种View Animation
Drawable Animation
Property Animation
这一篇讲一下简单的Drawable Animation。
Drawable Animation实现好是什么个样子呢?
帧动画,一张一张的图片。一次播形成动画的景象。
效果就是如此,把一帧一帧的图品相机播放,形成动画的效果。
Who to do?
简单的看你能够用handle然后诸如runOnUIThread来做这些事,可是view既然提供了这种实现。那为什么不用呢?首先,定义一个动画的xml(java代码执行,这里以XML声称为例),而且放在drable文件夹下
这里用的是back和positive做正放,倒放的事。
然后定义一下详细播放的图片内容以及持续时间
以下以倒播为例
<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>
再之后用button把动画开启,结束就OK了 十分简单
@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一获得就会调用这种方法
@Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); }
我们知道onResume也是Activity获取屏幕焦点时会被调用。那么2者又有什什么差别呢?
我们通过实验,用代码的Log来解释二者的差别
@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时
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退出时
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 Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged)
- 自己定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)
- 自定义View时,用到Paint Canvas的一些温故,简单的View Animation(动画二,“大大姐”的简单变动)
- 自定义View时,用到Paint Canvas的一些温故,简单的View Animation(动画二,“大大姐”的简单变动)
- 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ValueAnimator(动画四,“大大姐”的旋转跳跃no.2)
- 自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)
- 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)
- 自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)
- 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)
- 自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)
- 自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)
- 自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)
- 自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)
- 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ValueAnimator(动画四,“大大姐”的旋转跳跃no.2)
- 自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)
- 自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)
- 翻翻git之---"有趣效果"的自己定义View EasyArcLoading
- 自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 二,图像遮盖,Canvas静态变化)
- 自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 二,图像遮盖,Canvas静态变化)