[英]Android: how to add view to WindowManager, and keep it floating at the top of my app all the time?
我需要一个视图显示在我的应用程序的顶部,并且当它显示时,它可以继续显示在我应用程序的所有其他视图(所有片段和活动)的顶部。 它听起来像一个浮动操作按钮,但会始终显示在我的应用程序的顶部。
我知道我可以通过向手机的 WindowManager 添加视图来做到这一点,并在我退出我的应用程序时隐藏它,当我恢复我的应用程序时再次显示它。 这种棘手的方法可以奏效,但它也需要一些额外的许可,这是我试图避免的。
如果我只想在我的应用程序中显示,我可以在不征得用户额外许可的情况下实现吗? 如果答案是肯定的,那又如何呢? 关键似乎是视图的一些 LayoutParams,我试过但失败了。
如果答案可以显示一些详细代码和解释,那就太好了。
您必须为此使用WindowManager
首先在清单中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
添加要显示的图像。
chatheadImg = (ImageView)chatheadView.findViewById(R.id.chathead_img);
然后进行服务并向其中添加窗口管理器。
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
只需在视图上注册触摸事件
chatheadView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//To do
break;
case MotionEvent.ACTION_MOVE:
break;
});
查看这些教程以获得更好的理解
http://www.androidhive.info/2016/11/android-floating-widget-like-facebook-chat-head/
在清单中添加此权限 windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); layoutView = layoutInflater.inflate(R.layout.ringing_layout, null);
phoneTv = layoutView.findViewById(R.id.phone);
Log.d("TAG", "showLayout: " + phoneTv );
p = new WindowManager.LayoutParams(
// Shrink the window to wrap the content rather than filling the screen
600, 600,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSLUCENT);
layoutView.findViewById(R.id.close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
windowManager.removeView(layoutView);
}
});
p.gravity = Gravity.CENTER | Gravity.CENTER;
p.x = 0;
p.y = 0;
windowManager.addView(layoutView, p);
Log.d("TAG", "showLayout: ");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.