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行业感兴趣的新人

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

资料⬅专栏获取

相关推荐
勿问东西11 分钟前
【Android】设备操作
android
五味香18 分钟前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
PYSpring40 分钟前
数据结构-LRU缓存(C语言实现)
c语言·数据结构·缓存
图王大胜2 小时前
Android Framework AMS(01)AMS启动及相关初始化1-4
android·framework·ams·systemserver
CoderJia程序员甲3 小时前
重学SpringBoot3-集成Redis(一)
java·redis·缓存·springboot
工程师老罗4 小时前
Android Button “No speakable text present” 问题解决
android
小雨cc5566ru5 小时前
hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g
android·微信小程序·uni-app
周周写不完的代码5 小时前
redis-数据类型
数据库·redis·缓存
小雨cc5566ru6 小时前
微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台
android·微信小程序·uni-app
小雨cc5566ru6 小时前
小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现
android·小程序·uni-app