Подтвердить что ты не робот

Как нарисовать представление поверх всего?

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

введите описание изображения здесь

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

Пример:

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

4b9b3361

Ответ 1

То, что вы ищете, это системное предупреждение.

Там есть библиотека под названием StandOut! который поможет вам в создании таких приложений.

Ответ 2

Вот как работают тосты и диалоговые окна:

В случае, когда простое добавление или перенос на передний план не работает, скажите, когда у вас есть служба, добавьте свой собственный вид в другую активность или приложение клиента (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 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);
       }
   }

Ответ 3

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

Если вы хотите делать специальные вещи с помощью этого дополнительного представления, вы можете создать свой собственный класс вида

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

Ответ 4

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

Пример:

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

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

Ответ 5

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

ВСЕ НАСТРОЙКИ  Ваше изображение прилипает к вашему окну (на любом экране во всех приложениях), пока приложение не будет закрыто.

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