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

记得点个赞哦。

时间: 2024-10-14 20:13:57

自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,&quot;掏粪男孩Gif&quot;顺便再提提onWindowFocusChanged)的相关文章

自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)

转载请注明出处:王亟亟的大牛之路 这两天都在写Paint Canvas 昨天前天都写的比较基础的一些只是和一些简单的Demo演示,那今天就写一个"大气磅礴的"(之前几篇没看的可以看下传送门:http://blog.csdn.net/ddwhan0123/article/details/50426935) 废话不多,先上效果 YE? 为什么贴2个一模一样的试图,你错了!不带toCopy按钮的那整个Activity都是画的,并且还有点击事件哦! 再贴一下2张图片(上面张为原图,下面一张为效

自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 二,图像遮盖,Canvas静态变化)

转载请注明出处:王亟亟的大牛之路 上一篇把简单的一些概念理一理,还画了个圈,那这一篇讲一下图像遮盖"Xfermode"和Canvas的旋转.平移等效果 Xfermode: AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图). PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素异或操作. PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任

自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)

转载请注明出处:王亟亟的大牛之路 最近的一系列文章都是些的自定义控件的绘制,动画等效果,这一片就直接做一个自定义view,上一篇的地址:http://blog.csdn.net/ddwhan0123/article/details/50477030(没看的小伙伴可以看下) 照惯例,贴下演示效果 包结构: 设计分析 黄色为整个控件的整体,绿色部分为绘画出来的六边形,蓝色为一个标准的TextView 问题,为什么不把控件做在一起? 一开始有考虑过直接paint一整个控件把六边形和文字都画出来,想想还

自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)

转载请注明出处王亟亟的大牛之路 上礼拜上了一篇关于动画的自定义View的文章,然后里面的实现是PathMeasure,然后这一部分貌似以前没有讲过,那么就再补一篇来介绍下这部分的知识(之前一篇的传送门:http://blog.csdn.net/ddwhan0123/article/details/51066859) 直接说有点抽象,我们来看下演示的效果: 动的时候,是这样子 那暂停是这样子 其实这样的实现,一个个坐标增量画然后一直Invalidate也能做,但是写起来太麻烦,PathMeasur

自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)

转载请注明出处:王亟亟的大牛之路 上一篇讲了一些比较基础的view Animation 这篇会选PropertyAnimation的部分功能来讲一下,因为它的子类还是蛮多的,希望分的篇幅多点,然后可以讲细点 先上一下跑的效果(gif吃动画,见谅,大家可以自己run下) 这篇主要会讲以下几部分 - ObjectAnimator - AnimatorSet - PropertyValuesHolder 以及与之相关的一些知识点 Property Animation相对于我们昨天的View Anima

自己定义 View 基础和原理

课程背景: 在 Android 提供的系统控件不能满足需求的情况下,往往须要自己开发自己定义 View 来满足需求,可是该怎样下手呢.本课程将带你进入自己定义 View 的开发过程,来了解它的一些原理. 核心内容: 1.编写自己的自己定义 View 2.增加逻辑线程 3.提取和封装自己定义 View 4.利用 xml 中定义样式来影响显示效果 编写自己的自己定义 View(上) 本课时主要解说最简单的自己定义 View,然后增加绘制元素(文字.图形等),而且能够像使用系统控件一样在布局中使用.

【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现

利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的橡皮擦就是白色的画笔,根本不用使用到画笔的setXfermode方法,要搞一堆复杂的project. 用户画完图之后能够保存图像.图像的文件名称是当前的时间.保存的位置是sdcard的根文件夹. 制作步骤例如以下: 1.先设置好字体文件res\values\strings.xml,主要是app的名称

【Android】自己定义View、画布Canvas与画笔Paint

安卓自己定义View事实上非常easy. 这个View能够像<[Android]利用Java代码布局,button加入点击事件>(点击打开链接)一样.利用Java代码生成一系列的组件. 也能够配合画布Canvas与画笔Paint来使用. 以下用一个样例来说明.例如以下图,有一个自己定义布局View.里面摆放着,利用画布Canvas与画笔Paint绘制出来的蓝色正方形与红色文字. 在res\layout\activity_main.xml中.直接像摆放安卓固有组件一样,能够直接使用这个我定义组件

安卓自己定义View进阶-Canvas之绘制基本形状

Canvas之绘制基本形状 作者微博: @GcsSloop [本系列相关文章] 在上一篇自己定义View分类与流程中我们了解自己定义View相关的基本知识,只是,这些东西依然还是理论,并不能拿来(zhuang)用(B), 这一次我们就了解一些能(zhaung)用(B)的东西. 在本篇文章中,我们先了解Canvas的基本用法,最后用一个小演示样例来结束本次教程. 一.Canvas简单介绍 Canvas我们能够称之为画布,能够在上面绘制各种东西,是安卓平台2D图形绘制的基础,非常强大. **一般来说