Java 如何在所有东西的顶部绘制视图?
我想做一个应用程序,可以在屏幕上创建任何当前显示的通知。类似Go SMS消息弹出窗口或类似下图中聊天头的内容: 如果可以动态绘制,包括触摸事件,那就更好了。传统的或标准的方法是什么 示例:Java 如何在所有东西的顶部绘制视图?,java,android,view,notifications,Java,Android,View,Notifications,我想做一个应用程序,可以在屏幕上创建任何当前显示的通知。类似Go SMS消息弹出窗口或类似下图中聊天头的内容: 如果可以动态绘制,包括触摸事件,那就更好了。传统的或标准的方法是什么 示例: 就像一个可以被点击或拖动的图标,无论你是在主屏幕上,还是在应用程序抽屉上,还是在其他应用程序上。注意张贴的图片中屏幕边缘附近的圆形图标。您可以在任何应用程序中将它们拖动到任何位置。您不需要新的活动即可完成此操作。您所需要做的就是将另一个视图添加到现有活动中,并将其放在最前面,然后在该视图中绘制/写入所需的内
就像一个可以被点击或拖动的图标,无论你是在主屏幕上,还是在应用程序抽屉上,还是在其他应用程序上。注意张贴的图片中屏幕边缘附近的圆形图标。您可以在任何应用程序中将它们拖动到任何位置。您不需要新的活动即可完成此操作。您所需要做的就是将另一个视图添加到现有活动中,并将其放在最前面,然后在该视图中绘制/写入所需的内容 如果你想用这个额外的视图做一些特殊的事情,你可以创建你自己的视图类
class DrawOnTop extends View {
public DrawOnTop(Context activity) {
super(activity);
}
@Override
protected void onDraw(Canvas canvas) {
// put your drawing commands here
}
}
然后你做了一些类似的事情
DrawOnTop mDraw = new DrawOnTop(this);
addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mDraw.bringToFront();
然后要强制它绘制,需要使用mDraw.invalidate() 您可以将整个布局的父级作为RelativeLayout。第一个子元素是主布局的“根”。之后的任何东西都可以被视为一个覆盖物,可以根据你的突发奇想进行放置 例如:
<RelativeLayout>
<LinearLayout>
... Main Layout here ...
</LinearLayout>
<TextView left="20dip" top="20dip" text="Overlay" alpha="0.7" />
</RelativeLayout>
... 这里的主要布局。。。
您要查找的是系统警报窗口
有一个图书馆叫!这将有助于您创建此类应用程序。下面是Toast和dialog windows的工作原理: 如果仅仅添加或引入到前端不起作用,例如,当您让一个服务将其自己的视图添加到另一个客户端活动或应用程序时(FaceUnlock会这样做),或者您不能依赖于层次结构,那么您需要使用窗口管理器和窗口令牌来执行此操作。然后,您可以像以前一样创建布局并利用动画和硬件加速
WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FIRST_SUB_WINDOW);
layoutParams.width = 300;
layoutParams.height = 300;
layoutParams.format = PixelFormat.RGBA_8888;
layoutParams.flags =
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
layoutParams.token = getWindow().getDecorView().getRootView().getWindowToken();
//Feel free to inflate here
mTestView = new View(this);
mTestView.setBackgroundColor(Color.RED);
//Must wire up back button, otherwise it's not sent to our activity
mTestView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
}
return true;
}
});
windowManager.addView(mTestView, layoutParams);
然后确保删除onDestroy(或onPause)视图,否则将崩溃
if (mTestView != null) {
WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
if (mTestView.isShown()) {
windowManager.removeViewImmediate(mTestView);
}
}
最好的方法是使用应用程序启动服务。 创建一个ImageView。 设置图像视图的布局参数。 创建服务时,将视图和参数一起添加到窗口管理器中 一切就绪 您的图像将粘贴到窗口(在所有应用程序的任何屏幕上),直到您的应用程序关闭 您甚至可以将onclicklisteners和ontouchlisteners添加到imageview。
例如,单击“侦听器”以执行某些操作,单击“侦听器”可在屏幕上移动图像。请参阅此问题的答案:如此透明不会消耗所有触摸事件?是的,但如果您正在绘制另一个活动的顶部,这通常是您想要的。我的建议是,如果用户接触到外部,请关闭您的视图。是否成功?我也需要它。我的意思是,像一个图标,无论你是在主屏幕上,还是在应用程序菜单上,还是在其他应用程序上,都可以点击或拖动。我使用我发布的内容在活动的主视图顶部绘制文本和位图。我猜你也可以用它来做你的建议。对不起,我想我把我的问题搞错了!我想利用其他应用程序,而不是在我的own@Stochastically,您不知道哪里有足够的代码实现,是吗?我尝试自己的版本已经很久了,但无法让它在视图顶部绘制。@Gurfuffle我从去年开始就没有参与过Android编码,所以不确定代码在哪里。很抱歉你是对的,但就我而言,我是在其他应用程序(如home screen等)的顶部绘制的,或者它没有发生:/