2013-04-28 3 views
13

Desidero creare un'app che possa creare notifiche sullo schermo sopra tutto ciò che è attualmente visualizzato. Qualcosa come il messaggio pop-up Go SMS o qualcosa di simile al ChatHead nella figura seguente:Come disegnare una vista sopra tutto?

enter image description here

Sarebbe ancora meglio se è possibile trarre esso compreso dinamicamente tocco events.What è il modo convenzionale o standard per fare questo?

Esempio:

come un'icona che può essere cliccato o trascinata, non importa se si è sulla schermata iniziale o cassetto app o altro apps.Pay attenzione alle icone circolari in prossimità dei bordi dello schermo del foto pubblicata Puoi trascinarli ovunque in qualsiasi app.

+0

Vedere la risposta a questa domanda: http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android – Jules

+0

Così trasparente non consumare tutti gli eventi touch? – Allahjane

+0

Sì, ma di solito è quello che desideri se stai disegnando sopra un'altra attività. Ignora la tua vista se l'utente tocca all'esterno sarebbe il mio consiglio. – Jules

risposta

8

Non hai bisogno di una nuova attività per farlo. Tutto quello che devi fare è aggiungere un'altra vista alla tua attività esistente e portarla in primo piano e disegnare/scrivere le cose che vuoi in quella vista.

Se si vuole fare cose speciali con questa visione in più, è possibile creare la propria classe vista

class DrawOnTop extends View { 
    public DrawOnTop(Context activity) { 
     super(activity); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // put your drawing commands here 
    } 

} 

e poi fare qualcosa di simile

DrawOnTop mDraw = new DrawOnTop(this); 
addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
mDraw.bringToFront(); 

Poi per costringerlo a disegnare, è necessario utilizzare mDraw.invalidate();

+0

Intendo come un'icona che può essere cliccata o trascinata, indipendentemente dal fatto che ci si trovi in ​​homescreen o nei menu di app o altre app – Allahjane

+0

Ho usato quello che ho postato per disegnare testo e bitmap sopra la vista principale in un'attività. La mia ipotesi è che potresti usarla per fare anche quello che stai suggerendo. – Stochastically

+0

Scusa, penso di aver sbagliato la mia domanda! Voglio disegnare su altre app non mie da solo – Allahjane

1

Si potrebbe avere il genitore dell'intero layout come RelativeLayout. Il primo figlio è la "radice" del tuo layout principale. Qualsiasi cosa dopo di ciò può essere considerata una sovrapposizione che è posizionabile secondo i vostri capricci.

Esempio:

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

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

Hai ragione ma nel mio caso sto attingendo altre app come la schermata iniziale ecc. Ecc. – Allahjane

+0

Ah. Quindi questo non funzionerebbe. – Knossos

9

Quello che state cercando è sistema finestra di avviso.

C'è una libreria chiamata StandOut! che ti assisterà nella creazione di tali app.

9

Ecco come le cose come Toast e le finestre di dialogo di lavoro:

Nel caso in cui semplicemente aggiungendo o portare in primo piano non funziona, dire quando si stanno avendo un servizio di aggiungere la propria visione ad un'altra attività client o applicazione (FaceUnlock fa questo), o non puoi dipendere da gerarchie, devi usare il gestore di finestre e un token di finestra per fare il trucco. È quindi possibile creare layout e sfruttare le animazioni e l'accelerazione hardware come prima.

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

quindi assicuratevi di rimuovere l'OnDestroy vista (o onPause) o si andrà in crash

if (mTestView != null) { 
     WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE); 
     if (mTestView.isShown()) { 
      windowManager.removeViewImmediate(mTestView); 
     } 
    } 
1

Il modo migliore è quello di avviare un servizio con l'applicazione. Creare un ImageView. Impostare i layoutParam della vista immagine. Aggiunge la vista insieme ai parametri al gestore di finestre quando viene creato il servizio.

ALL SET L'immagine rimane sulla finestra (in qualsiasi schermata su tutte le app), finché l'applicazione non viene chiusa.

È anche possibile aggiungere onclicklisteners e onuchlisteners alla visualizzazione di immagini. Es. Gli ascoltatori di OnClick eseguono alcune azioni e Ontouchlisteners sposta l'immagine lungo lo schermo.