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