Android面试题之动画+事件处理篇

前言

提示:秋招在即,计蒙准备在国庆假期结束前整理一套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访问加上锁,一个伪锁。


关于整理问题

当全部整理完毕后将整理成pdf格式,以方便阅读,文件获取如下图(10月8日后)!


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42761395/article/details/108906142
今日推荐