自定义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

这里写图片描述

记得点个赞哦!

目录
相关文章
|
7月前
|
前端开发 人机交互
Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸
Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸
231 0
|
5月前
|
XML Java Android开发
Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)
Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)
85 0
|
5月前
|
XML Java Android开发
Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)
Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)
48 0
|
5月前
|
XML Java Android开发
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
Android App开发手机阅读中贝塞尔曲线的原理讲解及实现波浪起伏动画实战(附源码和演示视频 可直接使用)
53 0
|
7月前
|
图形学
[学习][笔记] qt5 从入门到入坟:<九>反走样,渐变
[学习][笔记] qt5 从入门到入坟:<九>反走样,渐变
|
8月前
|
前端开发 开发者
|
前端开发
零基础CSS入门教程(9)——背景颜色和背景图片
我们在images文件夹下放置一张图片,然后通过background-image来设置背景图。本小结我们学习了背景图片设置,背景颜色的设置,这两个设置再css里面很常用,我们要熟练掌握。如果觉得背景色不够好看,还可以找一张图片作为背景图,就想我们电脑或者手机的壁纸一般。我们前几小节学习了如何设置字体格式,我们这一小节学习一下如何设置背景颜色和图片。
零基础CSS入门教程(9)——背景颜色和背景图片
C#编程-52:PictureBox控件复习笔记
C#编程-52:PictureBox控件复习笔记
|
前端开发
妙用 background 实现花式文字效果
妙用 background 实现花式文字效果
154 0
妙用 background 实现花式文字效果