Android创建应用全局小窗口

Android创建应用全局小窗口,第1张

类似微信视频、语音时点击返回会形成一个App小窗口浮动在界面上,点击继续是通通话,如下图:

其实实现这个功能只需要你细心分析一下就有思路了:首先这个小窗口是浮动在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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11539460.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存