悬窗播放视频,让你聊天看视频两不误(下)

原创 2017年03月02日 16:09:35

下面实现最小化悬窗,点击继续悬窗播放,拖动小火箭效果。
这部分代码借鉴了网上的小火箭效果
这里写图片描述
点击悬窗视频的一个按钮启动另一个server。展现小按钮图标。

case R.id.iv_small:
             MyApplicaton.setValueProgress(valueProgress);
             onExit();
             Intent i = new Intent(context, FloatWindowService.class);
             context.startService(i);
             break;

下面看FloatWindowService里面代码。createSmallWindow创建小悬浮窗。

       @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        MyWindowManager.createSmallWindow(getApplicationContext());
        return super.onStartCommand(intent, flags, startId);
    }

MyWindowManager中的方法


     //小悬浮窗View的实例 
    private static FloatWindowSmallView smallWindow;
/**
     * 创建一个小悬浮窗。初始位置为屏幕的右部中间位置。
     */
    public static void createSmallWindow(Context context) {
        WindowManager windowManager = getWindowManager(context);
        int screenWidth = windowManager.getDefaultDisplay().getWidth();
        int screenHeight = windowManager.getDefaultDisplay().getHeight();
        if (smallWindow == null) {
            smallWindow = new FloatWindowSmallView(context);
            if (smallWindowParams == null) {
                smallWindowParams = new LayoutParams();
                smallWindowParams.type = LayoutParams.TYPE_SYSTEM_ALERT;
                smallWindowParams.format = PixelFormat.RGBA_8888;
                smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | LayoutParams.FLAG_NOT_FOCUSABLE;
                smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
                smallWindowParams.width = FloatWindowSmallView.windowViewWidth;
                smallWindowParams.height = FloatWindowSmallView.windowViewHeight;
                smallWindowParams.x = screenWidth;
                smallWindowParams.y = screenHeight / 2;
            }
            smallWindow.setParams(smallWindowParams);
            windowManager.addView(smallWindow, smallWindowParams);
        }
    }

    /**
     * 将小悬浮窗从屏幕上移除。
     */
    public static void removeSmallWindow(Context context) {
        if (smallWindow != null) {
            WindowManager windowManager = getWindowManager(context);
            windowManager.removeView(smallWindow);
            smallWindow = null;
        }
    }

    private static WindowManager getWindowManager(Context context) {
        if (mWindowManager == null) {
            mWindowManager = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
        }
        return mWindowManager;
    }

创建小火箭的代码如下:

/**
     * 创建一个火箭发射台,位置为屏幕底部。
     */
    public static void createLauncher(Context context) {
        WindowManager windowManager = getWindowManager(context);
        int screenWidth = windowManager.getDefaultDisplay().getWidth();
        int screenHeight = windowManager.getDefaultDisplay().getHeight();
        if (rocketLauncher == null) {
            rocketLauncher = new RocketLauncher(context);
            if (launcherParams == null) {
                launcherParams = new LayoutParams();
                launcherParams.x = screenWidth / 2 - RocketLauncher.width / 2;
                launcherParams.y = screenHeight - RocketLauncher.height;
                launcherParams.type = LayoutParams.TYPE_PHONE;
                launcherParams.format = PixelFormat.RGBA_8888;
                launcherParams.gravity = Gravity.LEFT | Gravity.TOP;
                launcherParams.width = RocketLauncher.width;
                launcherParams.height = RocketLauncher.height;
            }
            windowManager.addView(rocketLauncher, launcherParams);
        }
    }

    /**
     * 将火箭发射台从屏幕上移除。
     */
    public static void removeLauncher(Context context) {
        if (rocketLauncher != null) {
            WindowManager windowManager = getWindowManager(context);
            windowManager.removeView(rocketLauncher);
            rocketLauncher = null;
        }
    }

    /**
     * 更新火箭发射台的显示状态。
     */
    public static void updateLauncher() {
        if (rocketLauncher != null) {
            rocketLauncher.updateLauncherStatus(isReadyToLaunch());
        }
    }
/**
     * 判断小火箭是否准备好发射了。
     * 
     * @return 当火箭被发到发射台上返回true,否则返回false。
     */
    public static boolean isReadyToLaunch() {
        if ((smallWindowParams.x > launcherParams.x && smallWindowParams.x
                + smallWindowParams.width < launcherParams.x
                + launcherParams.width)
                && (smallWindowParams.y + smallWindowParams.height > launcherParams.y)) {
            return true;
        }
        return false;
    }

下面看FloatWindowSmallView 里面的代码
主要是onTouchEvent方法

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            isPressed = true;
            // 手指按下时记录必要数据,纵坐标的值都需要减去状态栏高度
            xInView = event.getX();
            yInView = event.getY();
            xDownInScreen = event.getRawX();
            yDownInScreen = event.getRawY() - getStatusBarHeight();
            xInScreen = event.getRawX();
            yInScreen = event.getRawY() - getStatusBarHeight();
            break;
        case MotionEvent.ACTION_MOVE:
            xInScreen = event.getRawX();
            yInScreen = event.getRawY() - getStatusBarHeight();
            // 手指移动的时候更新小悬浮窗的状态和位置
            updateViewStatus();
            updateViewPosition();
            break;
        case MotionEvent.ACTION_UP:
            isPressed = false;
            if (MyWindowManager.isReadyToLaunch()) {
                launchRocket();//符合则发射
            } else {
                updateViewStatus();
                // 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。
                if (xDownInScreen == xInScreen && yDownInScreen == yInScreen) {

                    openFloatMovie();
                }
            }
            break;
        default:
            break;
        }
        return true;
    }

/**
     * 用于发射小火箭。
     */
    private void launchRocket() {
        MyWindowManager.removeLauncher(getContext());
        new LaunchTask().execute();
    }

    /**
     * 开始执行发射小火箭的任务。
     * 
     * @author guolin
     */
    class LaunchTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            // 在这里对小火箭的位置进行改变,从而产生火箭升空的效果
            while (mParams.y > 0) {
                mParams.y = mParams.y - 10;
                publishProgress();
                try {
                    Thread.sleep(8);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            windowManager.updateViewLayout(FloatWindowSmallView.this, mParams);
        }

        @Override
        protected void onPostExecute(Void result) {
            // 火箭升空结束后,回归到悬浮窗状态
            updateViewStatus();

            openFloatMovie();
        }

private void openFloatMovie() {
        Intent mIntent = new Intent("createUI");
        mIntent.setClass(getContext(), MediaPlaybackService.class);
        getContext().startService(mIntent);
        MyWindowManager.removeSmallWindow(getContext());
    }

    }
/**
     * 更新小悬浮窗在屏幕中的位置。
     */
    private void updateViewPosition() {
        mParams.x = (int) (xInScreen - xInView);
        mParams.y = (int) (yInScreen - yInView);
        windowManager.updateViewLayout(this, mParams);
        MyWindowManager.updateLauncher();
    }

    /**
     * 更新View的显示状态,判断是显示悬浮窗还是小火箭。
     */
    private void updateViewStatus() {
        if (isPressed && rocketImg.getVisibility() != View.VISIBLE) {
            mParams.width = rocketWidth;
            mParams.height = rocketHeight;
            windowManager.updateViewLayout(this, mParams);
            smallWindowLayout.setVisibility(View.GONE);
            rocketImg.setVisibility(View.VISIBLE);
            MyWindowManager.createLauncher(getContext());
        } else if (!isPressed) {
            mParams.width = windowViewWidth;
            mParams.height = windowViewHeight;
            windowManager.updateViewLayout(this, mParams);
            smallWindowLayout.setVisibility(View.VISIBLE);
            rocketImg.setVisibility(View.GONE);
            MyWindowManager.removeLauncher(getContext());
        }
    }
    /**
     * 用于获取状态栏的高度。
     * 
     * @return 返回状态栏高度的像素值。
     */
    private int getStatusBarHeight() {
        if (statusBarHeight == 0) {
            try {
                Class<?> c = Class.forName("com.android.internal.R$dimen");
                Object o = c.newInstance();
                Field field = c.getField("status_bar_height");
                int x = (Integer) field.get(o);
                statusBarHeight = getResources().getDimensionPixelSize(x);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return statusBarHeight;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

悬窗播放视频,让你聊天看视频两不误(下)

下面实现最小化悬窗,点击继续悬窗播放,拖动小火箭效果。 这部分代码借鉴了网上的小火箭效果 点击悬窗视频的一个按钮启动另一个server。展现小按钮图标。case R.id.iv_small: ...
  • King1425
  • King1425
  • 2017年03月02日 16:09
  • 2270

android 用浮动窗口播放视频

  • 2014年11月09日 12:41
  • 86KB
  • 下载

悬窗播放视频,让你聊天看视频两不误(上)

当年的毕业设计拿出来记录一下,实现效果图如下:视频播放用的是vitamio框架。这里只讨论实现悬浮窗播放视频的思路1.点击视频播放器中的悬窗按钮,开启悬窗播放模式。这里启动了一个后台server。 ...
  • King1425
  • King1425
  • 2017年03月02日 15:34
  • 1185

【读悟人】微信,拒绝切换,阅读一篇公众号文章和朋友聊天两不误

在你平时使用微信时,有没有遇到这样的困扰:     你正在看着公众号文章,突然,朋友发来一条消息。     此时你想及时回复,该怎么办呢?退出公众号,去聊天,然后再去找那篇文章,反反复复。...
  • yangchunlu0101
  • yangchunlu0101
  • 2018年01月10日 09:25
  • 97

Android 播放视频时,小窗口随意拖动

前几天还一直和产品交流看到一个视频随意拖拽的视频窗口。今天刚好看到一个博客就是这个简直nice 。不多说了直接上图 大概的思路:1、播放视频的view选择TextureView 2、ListVi...
  • u012162503
  • u012162503
  • 2016年12月20日 15:15
  • 1815

WindowManager.addView()实现悬浮窗口播放视频

  • 2016年08月19日 21:35
  • 6.18MB
  • 下载

linux播放视频的最简单方法

lz试过很多种方法,安了mplayer,发现播放视频只有声音没有图像,本来以为是检码器的问题,可是安了一堆东西发现还是不行。其实ubuntu为我们提供了一款视频播放软件。用windows键找到Movi...
  • gshengod
  • gshengod
  • 2013年01月24日 15:07
  • 2728

Ubuntu14.04 chrome浏览器无法播放视频修复

chrome无法播放视频可能是flash安装问题,可通过下面方法修复: 原文安装pepper flash playersudo apt-get install pepperflashplugin-...
  • u010499323
  • u010499323
  • 2016年09月07日 10:12
  • 1256

Android笔记#利用第三方播放器vitamio实现悬浮播放效果

最近面试,面试官问了我关于以前做过的项目的问题,我居然可耻的忘记了,因此有必要重新梳理一下。 达成这个目标大概分为三个步骤:1.创建一个悬浮窗口;2.将vitamio的videovi...
  • bfboys
  • bfboys
  • 2016年12月30日 22:49
  • 770

Android 浮动窗口进阶——画中画,浮动视频

今天继续上一篇Android顶层窗口、浮动窗口的进阶应用。上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口。今天主要是讲讲如何在顶层窗口里面播放视频,...
  • dxpqxb
  • dxpqxb
  • 2017年01月17日 11:30
  • 1371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:悬窗播放视频,让你聊天看视频两不误(下)
举报原因:
原因补充:

(最多只允许输入30个字)