2013-04-28 115 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將圖像沿屏幕移動。

相關問題