2013-04-28 13 views
13

Chcę utworzyć aplikację, która może tworzyć powiadomienia na ekranie obok wszystkiego, co aktualnie jest wyświetlane. Coś jak się komunikat wyskakujący Go SMS lub coś jak ChatHead na poniższym rysunku:Jak narysować widok na wszystko?

enter image description here

Byłoby jeszcze lepiej, jeśli jest to możliwe, aby wyciągnąć go dynamicznie tym dotykowym events.What jest konwencjonalny lub standardowy sposób to zrobić?

Przykład:

jak ikona, które można kliknąć lub przeciągnięty bez względu na to, czy jesteś na ekranie głównym lub aplikacji szuflady lub innego uwagi apps.Pay do okrągłych ikon w pobliżu krawędzi ekranu w zdjęcie opublikowane. Możesz przeciągać je w dowolne miejsce w dowolnej aplikacji.

+0

Patrz odpowiedź na to pytanie: http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android – Jules

+0

Więc przejrzysty przyzwyczajenie spożywać wszystkie zdarzenia dotykowe? – Allahjane

+0

Tak, ale zwykle to jest to, czego chcesz, jeśli chcesz nadrobić inne działania. Odrzucenie widoku, jeśli użytkownik dotknie poza nim byłoby moją radą. – Jules

Odpowiedz

8

Nie potrzebujesz nowej aktywności, aby to zrobić. Wszystko, co musisz zrobić, to dodać kolejny widok do istniejącej aktywności i przenieść go na wierzch, a także narysować/zapisać elementy, które chcesz w tym widoku.

Jeśli chcesz robić specjalne rzeczy z tego dodatkowego widzenia, można tworzyć własne klasy widok

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

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

} 

a następnie zrobić coś jak

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

Następnie do zmuszenia go do rysowania, musisz użyć mDraw.invalidate();

+0

Mam na myśli ikonę podobną do ikony, którą można klikać lub przeciągać bez względu na to, czy znajdujesz się na ekranie głównym, w menu aplikacji czy w innych aplikacjach. – Allahjane

+0

Wykorzystałem to, co napisałem, aby narysować tekst i mapy bitowe nad głównym widokiem w działaniu. Domyślam się, że możesz go użyć do zrobienia tego, co sugerujesz. – Stochastically

+0

Przepraszam, myślę, że podałem moje pytanie w niewłaściwy sposób! Chcę narysować inne aplikacje, które nie są moją własnością. – Allahjane

1

Możesz mieć nadrzędnego całego układu jako RelativeLayout. Pierwsze dziecko jest "korzeniem" głównego układu. Cokolwiek po tym można uznać za nakładkę, która jest odpowiednia do twoich zachcianek.

Przykład:

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

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

Masz rację, ale w moim przypadku rysuję na innych aplikacjach, takich jak ekran główny itp. Itd. – Allahjane

+0

Ah. Wtedy to by nie działało. – Knossos

9

Co szukasz jest system ostrzegania okno.

Istnieje biblioteka o nazwie StandOut! który pomoże Ci w tworzeniu takich aplikacji.

9

Oto jak rzeczy, jak tosty i okien dialogowych pracy:

W przypadku, gdy po prostu dodając lub doprowadzeniu do przodu nie działa, powiedzieć, kiedy masz usługę dodać swój własny pogląd na innej działalności klienta lub aplikacji (FaceUnlock to robi) lub nie możesz polegać na hierarchii, musisz użyć menedżera okien i tokena okna, aby to zrobić. Następnie możesz tworzyć układy i korzystać z animacji i akceleracji sprzętowej, jak wcześniej.

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

Następnie należy usunąć widok onDestroy (lub OnPause) lub można rozbić

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

Najlepszym sposobem jest uruchomić usługę z aplikacją. Utwórz ImageView. Ustaw opcje LayoutParams w widoku obrazu. Dodaj widok wraz z parametrami do menedżera okien, gdy usługa jest tworzona.

WSZYSTKO ZESTAW Twój obraz przykleja się do okna (na dowolnym ekranie we wszystkich aplikacjach), dopóki aplikacja nie zostanie zamknięta.

Można nawet dodawać użytkowników onclouch i ontouchlistenerów do widoku obrazu. Np. Słuchacze OnClick wykonują niektóre czynności, a Ontouchlistenci przesuwają obraz wzdłuż ekranu.

Powiązane problemy