Android悬浮窗口 利用是WindwoManager

1 首先我们写一个布局中放置要悬浮的控件 并加上id 以便对控件进行操作

<?xml version="1.0" encoding="utf-8"?>


<com.dou361.ijkplayer.widget.IjkVideoView
android:id="@+id/ijk_videoview"
android:layout_width=“match_parent”
android:layout_height=“match_parent”>

</com.dou361.ijkplayer.widget.IjkVideoView>

2 然后在activity中调用 并实例出来

在这里插入图片描述
3.全部代码如下。
/** 注意 清单文件中加 权限 */

package com.example.demowindowmanager;

import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import com.dou361.ijkplayer.widget.IjkVideoView;
import tv.danmaku.ijk.media.player.IMediaPlayer;

public class MainActivity extends AppCompatActivity {

private IjkVideoView ijk_videoview;
private WindowManager wm;
private WindowManager.LayoutParams params;
private static View view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    createFloatView();
}

private void createFloatView() {
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    params = new WindowManager.LayoutParams();

    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 系统级别的window
    params.format = PixelFormat.TRANSPARENT; // 背景透明
    params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

    params.width = 600;
    params.height = 600;

    LayoutInflater inflater = LayoutInflater.from(this);
    view = inflater.inflate(R.layout.window_layout,null); // 生成view
    ijk_videoview = view.findViewById(R.id.ijk_videoview); // 拿到ijkvideoview控件
    wm.addView(view,params); // 通过windowManager 添加控件到页面上用户可看到
    Uri uri = Uri.parse("http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8");
    ijk_videoview.setVideoURI(uri);// 设置播放视频
    ijk_videoview.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {
            ijk_videoview.start();// 准备好之后,进行播放
        }
    });
   //  对控件进行移动
    initTouchListener();
    initClickListener();
}

private void initClickListener() {
       view.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               //  TODO 点击事件的处理,  比如说跳转到另一个activity 放大播放
           }
       });
}

private void initTouchListener() {

     view.setOnTouchListener(new View.OnTouchListener() {
         int lastX,lastY;
         int parmX,parmY;
         @Override
         public boolean onTouch(View view, MotionEvent event) {
             switch (event.getAction()){
                 case MotionEvent.ACTION_DOWN:
                      lastX = (int) event.getRawX();
                      lastY = (int) event.getRawY();
                      parmX = params.x;
                      parmY = params.y;
                     break;
                  case MotionEvent.ACTION_MOVE:
                         int dx = (int) (event.getRawX() - lastY);
                         int dy = (int) (event.getRawY() - lastY);
                         params.x = parmX + dx;
                         params.y = parmY + dy;
                      break;
             }
             wm.updateViewLayout(view,params);
             return false;
         }
     });
}

}

// 补充一点
getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕),getY(),getRawY()一样的道理如果你的某个Activity中实现OnTouchListener接口,需要重写

onTouch(View view,MotionEvent event)

这个方法,
getRawX()和getRawY()获得的是相对屏幕的位置,getX()和getY()获得的永远是view的触摸位置坐标
(这两个值不会超过view的长度和宽度)。
如果重写Activity的

onTouchEvent(MotionEvent event)

,这个时候获得的是屏幕点击位置的坐标。event.getX() 与 event.getRawX()获取的值是一样的,event.getY() 与 event.getRawY()获取的值是一样,还能获取触摸标题栏时的坐标位置,但是触摸状态栏时的坐标位置不能获得。
(注:Activity上有两段宽度:一个是状态栏,一个是标题栏,每一个宽度都占了25像素)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值