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像素)