动画+事件处理篇

  • 前言
  • 动画
    • 1、Android 中的动画有哪几类
    • 2、动画能组合在一起使用么?
    • 3、插值器的种类有哪些?
    • 4.如何自定义插值器
    • 5.如何修改 Activity 进入和退出动画
  • 事件处理
    • 1、Handler 机制
    • 2、onTouch 和 onTouchEvent 有什么区别
    • 3、子线程中能不能 new handler?为什么?
    • 4、子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?
    • 5、为什么系统不建议在子线程访问UI?
  • 关于整理问题

前言

提示:秋招在即,计蒙准备在国庆假期结束前整理一套Android初级面试题籍,希望对大家有所帮助


提示:以下是本篇文章正文内容

动画

1、Android 中的动画有哪几类

帧动画、补间动画、属性动画


2、动画能组合在一起使用么?

可以将动画组合在一起使用AnimatorSet,

AnimatorSet.play() 播放当前动画的同时可以

  • .with() :将现有动画和传入的动画同时执行
  • .after() :将现有动画插入到传入的动画之后执行
  • .before() : 将现有动画插入到传入的动画之前执行

3、插值器的种类有哪些?

  • AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快
  • LinearInterpolator:以常量速率改变
  • AnticipateInterpolator:开始的时候向后然后向前甩
  • PathInterpolator:动画执行的效果按贝塞尔曲线
  • anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
  • CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
  • OvershootInterpolator:向前甩一定值后再回到原来位置
  • BounceInterpolator:动画结束的时候有弹起效果

4.如何自定义插值器

写一个类实现Interpolator接口,
Interpolator是一个空的接口继承了TimeInterpolator接口,
定义getInterpolation方法即可


5.如何修改 Activity 进入和退出动画

可以通过两种方式,一是通过定义 Activity 的主题,二是通过覆写 Activity 的overridePendingTransition 方法。


事件处理

1、Handler 机制

Handler能充当子线程和主线程之间的桥梁。
通常将 Handler 声明在 Activity 中,然后覆写 Handler 中的 handleMessage 方法,当子线程调用 handler.sendMessage()方法后 handleMessage 方法就会在主线程中执行。

这里面除了 Handler、Message 外还有隐藏的 Looper 和 MessageQueue 对象。在主线程中 Android 默认已经调用了 Looper.preper()方法,调用该方法的目的是在 Looper 中

创建 MessageQueue 成员变量并把 Looper 对象绑定到当前线程中。当调用 Handler 的sendMessage(对象)方法的时候就将 Message 对象添加到了 Looper 创建的 MessageQueue队列中,同时给 Message 指定了 target 对象,其实这个 target 对象就是 Handler 对象。主线程默认执行了 Looper.looper()方法,该方法从 Looper 的成员变量 MessageQueue 中取出 Message。

然后调用 Message 的 target 对象的 handleMessage()方法。这样就完成了整个消息机制。


2、onTouch 和 onTouchEvent 有什么区别

这两个方法都是在 View 的 dispatchTouchEvent 中调用的,onTouch 优先于 onTouchEvent执行。如果在 onTouch 方法中通过返回 true 将事件消费掉,onTouchEvent 将不会再执行。

另外需要注意的是,onTouch 能够得到执行需要两个前提条件,第一 mOnTouchListener 的值不能为空,第二当前点击的控件必须是 enable 的。因此如果你有一个控件是非 enable 的,那么给它注册 onTouch 事件将永远得不到执行。对于这一类控件,如果我们想要监听它的 touch 事件,就必须通过在该控件中重写 onTouchEvent 方法来实现。


3、子线程中能不能 new handler?为什么?

不能,如果在子线程中直接 new Handler()会抛出异常

当我们在dao主线程中创建Handler对象的时制候没有问题,是因为主线程会自动调用Looper.prepare()方法去给当前主线程创建并设置一个Looper对象,随意在Handler构造函数中从当前线程的对象身上拿到这个Looper。
但是子线程中并不会自动调用这个方法,所以要想在子线程中创建Handler对象就必须在创建之前手动调用Looper.prepare()方法,否则就会报错。


4、子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?

1、用 Activity 对象的 runOnUiThread 方法更新,在子线程中通过 runOnUiThread()方法更新 UI:
2、用 View.post(Runnable r)方法更新 UI


五、为什么系统不建议在子线程访问UI?

并不是子线程不能更新UI,而是非Looper线程不能更新UI。所以要想更新UI,需要保证该线程是一个Looper线程。

那么怎么才能成为一个合格的Looper线程呢?

个人知识有限,自我感觉良好的大概总结了一下。一个Looper线程应该具有如下特点:

1.首先需要调用Looper.prepare()方法

执行该方法会将当前线程初始化为一个Looper线程,实际上就是在该线程中创建一个Looper对象。

2.创建Handler对象

该Handler对象会将Runnable对象post到当前线程里Looper的MessageQueue中。

具体要执行的代码就可以写到该Runnable对象的run方法里。

3.调用Looper.loop方法,循环处理消息队列里的消息(任务)

    循环处理,处理获取到的每一条消息,将消息交付给该消息对应的handler对象(消息中包含其对应的handler),handler对象通过调用dispatchMessage方法处理该消息,     从而执行消息中的逻辑代码(Runnable对象run方法体中的代码)。

由于Toast.MakeText方法底层会创建一个handler,所以可以像上面那样直接调用Toast。当前也可以自己显示的创建一个handler对象,然后handler再去post消息到Looper的消息队列中:

public void backUpSms(View view) {new Thread() {@Overridepublic void run() {//备份短信,耗时操作  boolean result = SmsUtils.backUp(XXXActivity.this);if (result) {Looper.prepare();   //显示创建Handler,将Runnable对象postLooperMessageQueue Handler myHandler = new Handler();myHandler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(XXXActivity.this, "备份成功!!!!", Toast.LENGTH_SHORT).show();}});Looper.loop();} else {Looper.prepare();Toast.makeText(XXXActivity.this, "备份失败", Toast.LENGTH_SHORT).show();Looper.loop();}}}.start();

Android动画+事件处理详解相关推荐

  1. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  2. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  3. Android动画坐标系详解

    前段时间写dialog底部弹出动画的时候明明觉得自己写的是对的,但效果却不对.相信很多人在写View动画的时候都遇到过这种情况.今天本文就对症下药,跟大家聊聊Animation动画坐标系,至于Anim ...

  4. Android 吸入动画效果详解(仿mac退出效果)

    转载自:http://m.blog.csdn.net/blog/leehong2005/9127095 [转]Android 吸入动画效果详解 1,背景 吸入(Inhale)效果,最初我是在iOS上面 ...

  5. Android Animator(动画)类 详解

    Android Animator动画类 详解 动画分为3种 ValueAnimator类 ObjectAnimator类 AnimatorSet类 Animator的addListener()方法(监 ...

  6. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  7. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  8. 《Android游戏开发详解》一1.1 什么是编程

    本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.1节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.1 ...

  9. 《Android游戏开发详解》一1.8 控制流程第2部分——while和for循环

    本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.8节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.8 ...

最新文章

  1. Ubuntu10.04安装Flash插件
  2. Vue实例的生命周期
  3. Android系统Recovery工作原理之使用update.zip升级过程分析(五)
  4. 关于html5和css3的新特性
  5. Node.js的安装
  6. XMLJavaXMLBeans结合应用的价值
  7. 【阿里云课程】生成模型之GAN优化目标设计与改进
  8. 原码、补码、反码、1的补码
  9. 【PP】通过创建工程变更号修改BOM
  10. linux sh脚本 递增,Linux shell 脚本实现进度框
  11. 网络之DNS协议图解
  12. boost库中mutex、condition_variable与mutex::scoped_lock联合使用实现线程之间的通信
  13. HBase中的HMaster、HRegionServer、Zookeeper
  14. mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】...
  15. JAVA能做flash游戏吗_FLASH+JAVA开发实时网络游戏 (转:闪客帝国)
  16. C++primer 6.7节练习
  17. 【转】密码经济学: 区块链技术前景之路基
  18. 使用 Php Artisan Tinker 来调试你的 Laravel 时间 2016-06-19 22:58:13 Laravel学院 原文 http://laravelacademy.org/
  19. 网络计算机显示器接口,电脑显示器接口怎么配置才合理
  20. linux程序的常用保护机制

热门文章

  1. 华为OD机试 - 找朋友(Java JS Python)
  2. 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])
  3. ant-design-pro跨域问题
  4. 遇见你是我最美的意外
  5. 【STC8A8K64D4开发板】——开发板程序下载
  6. linux jar包zip包 进入修改配置文件
  7. c语言实现去除字符串中空格
  8. 去年净亏7.37亿美元,“自动驾驶第一股”的商业化之痛
  9. 艾伦·凯与Smalltalk语言
  10. 2020年电商行业的前景