自定义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做正放,倒放的事。

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

下面以倒播为例

<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

这里写图片描述

记得点个赞哦!

目录
相关文章
|
5月前
|
移动开发 前端开发 JavaScript
不使用canvas怎么实现一个刮刮卡效果?
不使用canvas怎么实现一个刮刮卡效果?
55 0
|
8月前
|
移动开发 JavaScript 前端开发
|
5天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现七彩动画光圈_ColorfulCircle】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现七彩动画光圈_ColorfulCircle】
|
7月前
|
前端开发 开发者
|
9月前
|
前端开发
canvas画布实现代码雨
canvas画布实现代码雨
65 0
|
11月前
|
容器
项目实战(三):banner加载网络图片,不变形,可缩放可完全显示
项目实战(三):banner加载网络图片,不变形,可缩放可完全显示
|
前端开发
零基础CSS入门教程(9)——背景颜色和背景图片
我们在images文件夹下放置一张图片,然后通过background-image来设置背景图。本小结我们学习了背景图片设置,背景颜色的设置,这两个设置再css里面很常用,我们要熟练掌握。如果觉得背景色不够好看,还可以找一张图片作为背景图,就想我们电脑或者手机的壁纸一般。我们前几小节学习了如何设置字体格式,我们这一小节学习一下如何设置背景颜色和图片。
零基础CSS入门教程(9)——背景颜色和背景图片
|
前端开发
零基础CSS入门教程(10)——背景图片平铺不平铺
如果是repeat他会分成四块一样的也是默认平铺,repeat-x平行平铺两个,repeat-y上下平铺两个,而no-repeat他是取消平铺,只显示一个*/如果是repeat他会分成四块一样的也是默认平铺,repeat-x平行平铺两个,repeat-y上下平铺两个,而no-repeat他是取消平铺,只显示一个。什么叫平铺呢,就是图像在窗口上是如何铺设的,是横向一张一张的铺,还是不平铺只展示一张图片,还是纵向的一张一张的铺。我们本小节学习了图片的平铺和不平铺,我们以后对图片设置花样多了许多方法。
零基础CSS入门教程(10)——背景图片平铺不平铺
|
前端开发 JavaScript
为何使用 Canvas 内元素动画总是在颤抖?
## 背景 过年的项目中遇到一个问题让我百思不得其解,明明我的帧率保持在60帧,为何我的动画却一直抖动? 我的场景是一个匀速直线运动的物体。 先上一个 [Demo](https://codepen.io/fanmingfei/pen/JvYdWW) 在这个 Demo 中,小姐姐是按照 x 轴 10px/s,y 轴 30 px/s 进行移动的,不过她的移动是明显伴随着抖动的。
1236 0