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

之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果。那么自己定义的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

记得点个赞哦。

最新文章

  1. Linux ls
  2. ul ol di三者区别
  3. C#汉字字母数字正则
  4. Cookie案例:简单登录界面中的应用
  5. 第二天 django apache
  6. loj 1025(记忆化搜索)
  7. mysql笔记02 创建高性能的索引
  8. FreeSWITCH一些需求应对
  9. Spring声明式事务配置管理方法(转)
  10. 51nod1084 矩阵取数问题 V2
  11. gcc都做了什么优化
  12. C++运算符重载的规则
  13. [改善Java代码]equals应该考虑null值的情景
  14. having与where区别
  15. Oracle查看LogMiner的详解
  16. jQuery 验证实例(shopnc二次开发)
  17. iphone5升级到iOS7时出现“This device isn&#39;t eligible for the requested build”错误
  18. Homebrew 1.0.0 发布,MacOS 上的包管理器
  19. CentOS7卸载KDE桌面(转)
  20. Servlet的补充知识

热门文章

  1. MikroTik RouterOS 5.x使用HunterTik 2.3.1进行破解
  2. 12174 - Shuffle
  3. DevExpress VCL for Delphi 各版本收集下载
  4. Npm安装以及express框架的使用
  5. NSString 和 NSData 转换
  6. C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信
  7. Shell 命令行快捷键
  8. git 两个中心仓库上的分支 merge
  9. Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)
  10. Gradle 简介