分享

android 浮动窗口实例(视频播放)

 mediatv 2017-05-15
public class MainActivity extends Activity {

private WebView web = null;
private WindowManager mWindowManager, wm;
private WindowManager.LayoutParams mLayoutParams;
private LayoutInflater mLayoutInflater;
private View mFloatView;
private int mCurrentX;
private int mCurrentY;
private static int mFloatViewWidth = 200;
private static int mFloatViewHeight = 200;
private VideoView videoView = null;
private boolean isFull = false;
private DisplayMetrics screen;
private Button btn_floatView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
web = (WebView)findViewById(R.id.web);
web.loadUrl("http://www.sohu.com");
Log.d("wangzq", "OnCreate called");
//覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开
web.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
//返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
view.loadUrl(url);
return true;
}
});
mWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mLayoutInflater = LayoutInflater.from(this);
createView();
}

private void createFloatView()
{
//final Button btn_floatView ;
btn_floatView = new Button(getApplicationContext());
btn_floatView.setText("悬浮窗悬浮窗悬浮窗悬浮窗悬浮窗悬浮窗悬浮窗");
mFloatView = mLayoutInflater.inflate(R.layout.play_view, null);

wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();

// 设置window type
params.type = WindowManager.LayoutParams.TYPE_PHONE;
/*
* 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些,
* 即拉下通知栏不可见
*/

params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明

// 设置Window flag
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
* wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
* LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
*/

// 设置悬浮窗的长得宽
params.width = 500;
params.height = 500;

// 设置悬浮窗的Touch监听
btn_floatView.setOnTouchListener(new View.OnTouchListener()
{
int lastX, lastY;
int paramX, paramY;

public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
paramX = params.x;
paramY = params.y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
params.x = paramX + dx;
params.y = paramY + dy;
// 更新悬浮窗位置
wm.updateViewLayout(btn_floatView, params);
break;
}
return true;
}
});
wm.addView(btn_floatView, params);
}

private void createButtonView()
{
btn_floatView = new Button(getApplicationContext());
btn_floatView.setText("悬浮窗");
mFloatView = mLayoutInflater.inflate(R.layout.play_view, null);

wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();

// 设置window type
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
/*
* 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些,
* 即拉下通知栏不可见
*/

params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明

// 设置Window flag
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
* wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
* LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
*/

// 设置悬浮窗的长得宽
params.width = 100;
params.height = 100;

// 设置悬浮窗的Touch监听
btn_floatView.setOnTouchListener(new View.OnTouchListener()
{
int lastX, lastY;
int paramX, paramY;

public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
paramX = params.x;
paramY = params.y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
params.x = paramX + dx;
params.y = paramY + dy;
// 更新悬浮窗位置
wm.updateViewLayout(btn_floatView, params);
break;
}
return true;
}
});
wm.addView(btn_floatView, params);
}

private void createView() {
// TODO Auto-generated method stub
//加载布局文件
mFloatView = mLayoutInflater.inflate(R.layout.play_view, null);
videoView = (VideoView)mFloatView.findViewById(R.id.videoView);
//为View设置监听,以便处理用户的点击和拖动
mFloatView.setOnTouchListener(new OnFloatViewTouchListener());
/*为View设置参数*/
mLayoutParams = new WindowManager.LayoutParams();
//设置View默认的摆放位置
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
//设置window type
mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//设置背景为透明
// mLayoutParams.format = PixelFormat.RGBA_8888;
//注意该属性的设置很重要,FLAG_NOT_FOCUSABLE使浮动窗口不获取焦点,若不设置该属性,屏幕的其它位置点击无效,应为它们无法获取焦点
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//设置视图的显示位置,通过WindowManager更新视图的位置其实就是改变(x,y)的值
mCurrentX = mLayoutParams.x = 0;
mCurrentY = mLayoutParams.y = 0;
//设置视图的宽、高
mLayoutParams.width = 700;
mLayoutParams.height = 700;
//将视图添加到Window中
mWindowManager.addView(mFloatView, mLayoutParams);
mWindowManager.getDefaultDisplay();
screen = getResources().getDisplayMetrics();
videoView.setVideoPath("/sdcard/test1.ts");
videoView.start();
}

private class OnFloatViewTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
Log.i("baiyuliang", "mCurrentX: " + mCurrentX + ",mCurrentY: "
+ mCurrentY + ",mFloatViewWidth: " + mFloatViewWidth
+ ",mFloatViewHeight: " + mFloatViewHeight);

if (event.getAction() == MotionEvent.ACTION_DOWN)
{
if (!isFull)
{
createButtonView();
}
else
{
wm.removeView(btn_floatView);
}
isFull = !isFull;
/*
if (!isFull) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
isFull = true;
mLayoutParams.width = screen.heightPixels;
mLayoutParams.height = screen.widthPixels;
mWindowManager.updateViewLayout(mFloatView, mLayoutParams);
videoView.getHolder().setFixedSize(mLayoutParams.width, mLayoutParams.height);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mLayoutParams.width = 300;
mLayoutParams.height = 300;
mWindowManager.updateViewLayout(mFloatView, mLayoutParams);
videoView.getHolder().setFixedSize(300, 300);
isFull = false;
}
*/
}
/*
* getRawX(),getRawY()这两个方法很重要。通常情况下,我们使用的是getX(),getY()来获得事件的触发点坐标,
* 但getX(),getY()获得的是事件触发点相对与视图左上角的坐标;而getRawX(),getRawY()获得的是事件触发点
* 相对与屏幕左上角的坐标。由于LayoutParams中的x,y是相对与屏幕的,所以需要使用getRawX(),getRawY()。
*/
mCurrentX = (int) event.getRawX() - mFloatViewWidth;
mCurrentY = (int) event.getRawY() - mFloatViewHeight;
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
//updateFloatView();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
}

@Override
public Object onRetainNonConfigurationInstance() {
return super.onRetainNonConfigurationInstance();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

private void updateFloatView() {
mLayoutParams.x = mCurrentX;
mLayoutParams.y = mCurrentY;
mWindowManager.updateViewLayout(mFloatView, mLayoutParams);
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多