How to draw a view on top of everything?

后端 未结 5 1182
独厮守ぢ
独厮守ぢ 2020-12-04 14:16

I want to make an app that can create notification on the screen on top of anything that is currently being displayed. Something like the Go SMS message popup or something l

相关标签:
5条回答
  • 2020-12-04 14:19

    Here is how things like Toast and dialog windows work:

    In the case where just adding or bringing to front does not work, say when you are having a service add its own view to another client activity or application (FaceUnlock does this), or you cannot depend on hierarchies, you need to use the window manager and a window token to do the trick. You can then create layouts and take advantage of animations and hardware acceleration as before.

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

    Then be sure to remove the view onDestroy (or onPause) or you will crash

       if (mTestView != null) {
           WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
           if (mTestView.isShown()) {
                windowManager.removeViewImmediate(mTestView);
           }
       }
    
    0 讨论(0)
  • 2020-12-04 14:26

    You could have the parent of your whole layout as RelativeLayout. The first child being the "root" of your main layout. Anything after that can be considered an overlay which is placeable to your whims.

    Example:

    <RelativeLayout>
      <LinearLayout>
        ... Main Layout here ...
      </LinearLayout>
    
      <TextView left="20dip" top="20dip" text="Overlay" alpha="0.7" />
    </RelativeLayout>
    
    0 讨论(0)
  • 2020-12-04 14:32

    You don't need a new activity to do this. All you need to do is to add another view into your existing activity and bring it to the front, and draw/write the things that you want into that view.

    If you want to do special things with this extra view, you could create your own view class

    class DrawOnTop extends View { 
        public DrawOnTop(Context activity) { 
            super(activity);
        }
    
        @Override 
        protected void onDraw(Canvas canvas) {
            // put your drawing commands here
        }
    
    }
    

    and then you do something like

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

    Then to force it to draw, you need to use mDraw.invalidate();

    0 讨论(0)
  • 2020-12-04 14:43

    The best way is to start a service with your application. Create an ImageView. Set the LayoutParams of the Image View. Add the view along with the params to the window manager when the service is created.

    ALL SET Your Image sticks to your window (At any screen over all apps), till you application is closed.

    You can even add onclicklisteners and ontouchlisteners to the imageview. Eg. OnClick listeners to perform some actions and Ontouchlisteners move the image along the screen.

    0 讨论(0)
  • 2020-12-04 14:45

    What you are looking for is System Alert Window.

    There's a library called StandOut! which will assist you in creating such apps.

    0 讨论(0)
提交回复
热议问题