2013-04-28 79 views
13

我想制作一个应用程序,可以在屏幕上创建当前正在显示的任何内容的通知。像下面的图片转到短信弹出窗口或类似的东西ChatHead东西:如何在一切上绘制视图?

enter image description here

它甚至会更好,如果有可能绘制动态,包括触摸events.What是传统或标准的方式去做这个?

例子:

如可点击或拖动无论你是否是主屏幕或应用程序的抽屉或其他apps.Pay注意屏幕在边缘附近的圆形图标上的图标图片发布。你可以在任何应用程序的任何地方拖动它

+0

看到这个问题的答案︰http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android – Jules 2013-04-28 15:52:10

+0

所以透明不会消耗所有触摸事件? – Allahjane 2013-04-28 15:56:12

+0

是的,但这通常是你想要的,如果你正在绘制另一个活动的顶部。如果用户接触到外部,请关闭您的视图,这将是我的建议。 – Jules 2013-04-28 15:58:36

回答

8

你不需要一个新的活动来做到这一点。您只需在现有活动中添加另一个视图,并将其展现在前面,然后将所需的内容绘制/写入该视图。

如果你想要做特别的事情处理这些额外的观点,你可以创建自己的视图类

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();

+0

我的意思是像可以点击或拖动无论你是否在主屏幕或应用程序菜单或其他应用 – Allahjane 2013-04-28 15:58:08

+0

我已经使用了我已张贴绘制文本和位图上的活动主视图顶部的图标。我的猜测是你可以用它来做你的建议。 – Stochastically 2013-04-28 16:04:13

+0

对不起,我想我把我的问题错误的方式!我想绘制其他应用程序,而不是我自己的 – Allahjane 2013-04-28 16:05:39

1

您可以将整个布局的父项作为RelativeLayout。第一个孩子是主布局的“根”。之后的任何事情都可以视为您可以随心所欲的覆盖。

例子:

<RelativeLayout> 
    <LinearLayout> 
    ... Main Layout here ... 
    </LinearLayout> 

    <TextView left="20dip" top="20dip" text="Overlay" alpha="0.7" /> 
</RelativeLayout> 
+0

你是正确的,但在我的情况下,我在其他应用程序,如主屏幕等等等等 – Allahjane 2013-04-28 16:02:20

+0

啊上绘制。那么这是行不通的。 – Knossos 2013-04-28 16:03:15

9

你在找什么是系统警告窗口。

有一个库叫StandOut!这将有助于您创建此类应用程序。

9

这里是东西像面包和对话窗口如何工作的:

在刚刚加入或将要前不工作的情况下,说,当你有一个服务添加自己的看法到另一个客户端活动或应用程序(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),或者你会崩溃

​​
1

最好的办法是与您的应用程序启动服务。 创建一个ImageView。 设置图像视图的LayoutParams。 创建服务时,将视图和params一起添加到窗口管理器。

ALL SET 你的图片粘到你的窗口(在对所有应用程序的任何屏幕),直到你的应用程序被关闭。

您甚至可以添加onclicklisteners和ontouchlisteners到ImageView的。例如, OnClick侦听器执行一些操作,并且Ontouchlisteners将图像沿屏幕移动。