Floating view on Android screen

前端 未结 3 921
没有蜡笔的小新
没有蜡笔的小新 2020-12-24 08:59

I was trying to make a floating view which user can drag around on the screen.

The idea is to launch a service and then inflate a view on the screen.

But t

相关标签:
3条回答
  • 2020-12-24 09:25

    By default, View will take up the entire available space when laid out with WRAP_CONTENT. You need to either explicitly specify the view size in your WindowManager.LayoutParams, override View.onMeasure, or (ideally) extend ImageView rather than View.

    0 讨论(0)
  • 2020-12-24 09:27

    from api 23+,before start service check Settings.ACTION_MANAGE_OVERLAY_PERMISSION permission:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!Settings.canDrawOverlays(ConversationsActivityWithSpam.this)) {
                        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                Uri.parse("package:" + getPackageName()));
                        startActivityForResult(intent, 16);
                        return false;
                    }
                }
    
    0 讨论(0)
  • 2020-12-24 09:33

    I tried your way of drawing the image on a canvas, but that didn't go anywhere. An example, EatHeat's github, where I learned from. Maybe this can get you rolling in the right direction, maybe not, but it worked for me.

    WalkingIconService.java

    package ...
    //imports
    
    public class WalkingIconService extends Service {
        private WindowManager mWindowManager;
        private ImageView image;
    
        public void onCreate() {
            super.onCreate();
            image = new ImageView(this);
    
            image.setImageResource(R.drawable.ic_launcher);
    
            mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    
            final LayoutParams paramsF = new WindowManager.LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT,
                LayoutParams.TYPE_PHONE,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
    
            paramsF.gravity = Gravity.TOP | Gravity.LEFT;
            paramsF.x=0;
            paramsF.y=100;
            mWindowManager.addView(image, paramsF);
    
            try{
    
                image.setOnTouchListener(new View.OnTouchListener() {
                    WindowManager.LayoutParams paramsT = paramsF;
                    private int initialX;
                    private int initialY;
                    private float initialTouchX;
                    private float initialTouchY;
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        switch(event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            initialX = paramsF.x;
                            initialY = paramsF.y;
                            initialTouchX = event.getRawX();
                            initialTouchY = event.getRawY();
                            break;
                        case MotionEvent.ACTION_UP:
                            break;
                        case MotionEvent.ACTION_MOVE:
                            paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
                            paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
                            mWindowManager.updateViewLayout(v, paramsF);
                            break;
                        }
                        return false;
                    }
                });
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    
        @Overrride
        public void onDestroy(){
            super.onDestory();
        }
    
    }
    

    MainActivity.java

    package ...
    //imports
    
    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(icicle) {
            super.onCreate(icicle);
            setcontentView(R.layout.activity_main);
            Button b = (Button)findViewById(R.id.tv);
            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //toast
                    startService(new Intent(MainActivity.this, WalkingIconService.class));
                }
            });
            //stopService (from my original code)
            Button stop = (Button)findViewById.(R.id.btnStop);
            stop.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    stopService(new Intent(MainActivity.this, WalkingIconService.class));
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题