转载请注明出处:王亟亟的大牛之路
之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果。那么自定义的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>
再之后用按钮把动画开启,结束就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
记得点个赞哦!