zoukankan      html  css  js  c++  java
  • 自己定义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>

    再之后用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

    这里写图片描写叙述

    记得点个赞哦。

  • 相关阅读:
    vue——样式穿透/deep/ >>> ::v-deep 三者的区别
    CSS Grid 网格布局教程
    CSS3中的display:grid网格布局介绍
    windows 好用的命令
    django分页
    django.template.exceptions.TemplateSyntaxError: 'staticfiles' is not a registered tag library. Must
    bootstrap模板
    django报错 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1
    bootstrapV4.4.1版本下载
    Dots demo解释相关
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7373077.html
Copyright © 2011-2022 走看看