
其实实现这个功能只需要你细心分析一下就有思路了:首先这个小窗口是浮动在app最上层的视图,其次所有触屏事件需先由该小窗口处理,还有就是小窗口的生命周期和Application也能虽可能不能同生,但是确是可以共死。所以可以在Application中创建一个view添加到WindowManage,这里将视图为view的window的type设置成系统级别的窗口,这样这个window可以在在全局呈现。另外,还需要让这个window可以随手指拖动而滑动,手指释放后会回d到距离这个释放点最近的屏幕侧边,所以需要重写view 的OnTouch事件。
以上就能实现一个应用内小窗口了,这里windowManager的布局参数有坑要踩:
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)View menuView = (View)mLayoutInflater.inflate(R.layout.alert_dialog_menu_layout_new, null, true)//d出窗口包含的视图
popupWindow = new PopupWindow(menuView, LayoutParams.FILL_PARENT,238, true)//创建d出窗口,指定大小 popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_style_alert_dialog_background))//设置d出窗口的背景
popupWindow.setAnimationStyle(R.style.PopupAnimation)//设置窗口显示的动画效果
popupWindow.showAtLocation(findViewById(R.id.parent), Gravity.BOTTOM, 0, 0)//设置窗口显示的位置
popupWindow.update()
Style.xml文件:
<style name="PopupAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/menu_up</item>
</style>
Meun_up.xml文件:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="500" android:fromXDelta="0.0" android:toXDelta="0.0" android:fromYDelta="100%" android:toYDelta="50%" />
</set>
上一篇讲了 setContentView 到所有布局的加载: 传送门
要想了解DecorView 如何添加到Window里面的,需要先了解Activity如何运行的
这里就要提到一个类ActivityThread,这里面的一个方法
其中比较关键的方法是调用是:
activity.attach(...)方法,这个方法内容如下:
随后再来看看 ActivityThread类中的handleResumeActivity方法,方法内容如下:
继续查看 WindowManagerImpl里面的addView方法
继续查看 ViewRootImpl类里面的setView方法,如下:
到这里,decorView 添加到PhoneWindow 基本结束了。下面我们继续查看,view 是如何在RootViewImpl类中绘制出来的。
查看ViewRootImpl类里面的 requestLayout()方法
继续查看 mTraversalRunnable
继续查看 performMeasure
decorView 实际上继承了 ViewGroup 、 View ,所以实际上也是调用的View的measure方法。所以这些 measure 、 layout 、 draw都是再ViewRootImpl发起的。
到这里,Activity 启动过程中生成PhoneWindow , 并加载DecorView ,之后调起绘制流程。
总结:ActivityThread.handleResumeActivity中,wm.addView(decor, l)
把decorView 添加到windowManager , 然后在WindowManagerImpl 里面初始化了 ViewRootImpl ,然后调用 ViewRootImpl.setView(),在setview方法里调用了view.assignParent(this),将Decorview的mParent设置成ViewRootImpl
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)