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


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


Android的UI访问是没有加锁的,多个线程可以同时访问更新操作同一个UI控件。也就是说访问UI的时候,android系统当中的控件都不是线程安全的,这将导致在多线程模式下,当多个线程共同访问更新操作同一个UI控件时容易发生不可控的错误,而这是致命的。所以Android中规定只能在UI线程中访问UI,这相当于从另一个角度给Android的UI访问加上锁,一个伪锁。


关于整理问题

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

外链图片转存中...(img-cWplN8YU-1719086400346)\]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人 都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 资料⬅专栏获取

相关推荐
Blue.ztl2 小时前
菜鸟之路day31一一MySQL之多表设计
android·数据库·mysql
练习本6 小时前
Android系统架构模式分析
android·java·架构·系统架构
每次的天空10 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
练习本11 小时前
Android MVC架构的现代化改造:构建清晰单向数据流
android·架构·mvc
早上好啊! 树哥11 小时前
android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示
android·ide·android studio
YY_pdd12 小时前
使用go开发安卓程序
android·golang
Android 小码峰啊14 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
bubiyoushang88814 小时前
深入探索Laravel框架中的Blade模板引擎
android·android studio·laravel
cyy29814 小时前
android 记录应用内存
android·linux·运维
AllenO.o14 小时前
Redis五种数据结构详解
java·数据结构·数据库·redis·缓存