2013-04-28 6 views
13

Я хочу создать приложение, которое может создавать уведомления на экране поверх всего, что отображается в данный момент. Что-то вроде всплывающего сообщения Go SMS или что-то вроде ChatHead в следующей картине:Как нарисовать вид сверху всего?

enter image description here

Было бы еще лучше, если это можно сделать динамически в том числе сенсорным events.What является обычным или стандартным способом сделать это?

Пример:

Подобно иконе, которая может быть нажата или тащила, независимо от того, являетесь ли вы на домашнем экране или приложение ящике или другой apps.Pay внимания на круглые значки вблизи краев экрана в фотография опубликована. Вы можете перетащить их в любом приложении.

+0

См. Ответ на этот вопрос: http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android – Jules

+0

Так прозрачный не будет потреблять все события касания? – Allahjane

+0

Да, но это обычно то, что вы хотите, если рисуете верхнюю часть другого действия. Отклоните свое мнение, если пользователь коснется его наружу, будет моим советом. – Jules

ответ

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

+0

Я использую то, что я разместил, чтобы нарисовать текст и растровые изображения поверх основного представления в действии. Я предполагаю, что вы можете использовать его, чтобы делать то, что вы предлагаете. – Stochastically

+0

Извините, я думаю, что поставил свой вопрос неправильно! Я хочу рисовать поверх других приложений не самостоятельно – Allahjane

1

У вас может быть родительский элемент всего вашего макета как RelativeLayout. Первый ребенок является «корнем» вашего основного макета. Все, что после этого можно считать наложением, которое можно разместить на ваших капризах.

Пример:

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

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

Вы правы, но в моем случае я рисую поверх других приложений, таких как домашний экран и т. Д. И т.д. – Allahjane

+0

Ah. Тогда это не сработает. – Knossos

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) или разобьет

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

Лучший способ для запуска службы с приложением. Создайте ImageView. Установите LayoutParams изображения. Добавьте представление вместе с параметрами в оконный менеджер при создании службы.

ALL SET Ваше изображение прилипает к вашему окну (на любом экране во всех приложениях), пока приложение не будет закрыто.

Вы даже можете добавить onclicklisteners и ontouchlisteners в изображение. Например. Слушатели OnClick выполняют некоторые действия, а Ontouchlisteners перемещают изображение по экрану.

Смежные вопросы