【Android】Android UI 绘制相关面试题(二)
一、谈谈自定义LayoutManager的流程?
- 确定Itemview的LayoutParamsgenerateDefaultLayoutParams
- 确定所有itemview在recyclerview的位置,并且回收和复 用itemviewonLayoutChildren
- 添加滑动canScrollVertically
二、什么是 RemoteViews?使用场景有哪些?
RemoteViews翻译过来就是远程视图.顾名思义,RemoteViews不是当前进程的View,是属于SystemServer进程.应用程序与RemoteViews之间依赖Binder实现了进程间通信.
用法:通常是在通知栏
//1.创建RemoteViews实例 RemoteViews mRemoteViews=new RemoteViews("com.example.remoteviewdemo", R.layout.remoteview_layout); //2.构建一个打开Activity的PendingIntent Intent intent=new Intent(MainActivity.this,MainActivity.class); PendingIntent mPendingIntent=PendingIntent.getActivity(Main Activity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //3.创建一个Notification mNotification = new Notification.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentIntent(mPendingIntent) .setContent(mRemoteViews) .build(); //4. 获 取 NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE ); Button button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //弹出通知 manager.notify(1, mNotification); } });
三、谈一谈获取View宽高的几种方法?
- OnGlobalLayoutListener获取
- OnPreDrawListener获取
- OnLayoutChangeListener获取
- 重写View的onSizeChanged()
- 使用View.post()方法
四、谈一谈插值器和估值器?
- 插值器,根据时间(动画时常)流逝的百分比来计算属 性变化的百分比。系统默认的有匀速,加减速,减速插值器。
- 估值器,通过上面插值器得到的百分比计算出具体变化 的值。系统默认的有整型,浮点型,颜色估值器
- 自定义只需要重写他们的evaluate方法就可以了。
五、getDimension、getDimensionPixelOffset 和getDimensionPixelSize 三者的区别?
相同点:单位为dp/sp时,都会乘以density,单位为px则不乘
不同点:
- getDimension返回的是float值
- getDimensionPixelSize,返回的是int值,float转成int时,四舍五入
- getDimensionPixelOffset,返回的是int值,float转int时,向下取整(即忽略小数值)
六、关于LayoutInflater,它是如何通过inflate 方法获取到具体View的?
系统通过LayoutInflater.from创建出布局构造器,inflate 方法中,最后会掉用createViewFromTag这里他会去判断两个参数factory2 和factory 如果都会空就会系统自己去创建view, 并且通过一个xml解析器,获取标签名字,然后判断是<Button还是xxx.xxx.xxView.然后走createView通过拼接得到全类名路径,反射创建出类。
七、谈谈RecyclerView的缓存机制?
#android面试#scrap viewCacherecyclerPool: scrap 是当前展示的缓存, 在onlayout时候 缓存viewCache 是屏幕外看不见的缓存, 可以吧viewCache设置大点, 空间换时间 避免段距离内快速滑动卡顿以上两种缓存是不走 createView和 onbind recyclerPool 比较特殊他是会走 onbind的,他可以被多个recyclerView共享内部的item,实际用途是:多个recyclerView之间共享item,应用在 垂直recyclerView 内嵌水平recyclerView,或者viewpager中多个recyclerView