这个悬浮窗是一个类似于微信通话的小屏视频框,利于Service开启和保持。悬浮是利用WindowManager实现

创建FloatingWindowService服务类

public class FloatingWindowService extends Service implements View.OnClickListener {

private WindowManager windowManager;

private WindowManager.LayoutParams layoutParams;

private View display;

private TextureView surfaceView;

private EasyPlayerClient client;

private boolean show=true;

private int qiehuan=0;

private long startTime=0;

private long endTime=0;

private boolean isclick=false;

public FloatingWindowService() {

}

@Override

public void onCreate() {

super.onCreate();

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

layoutParams = new WindowManager.LayoutParams();

// 设置图片格式,效果为背景透明

layoutParams.format = PixelFormat.RGB_565;

Log.i("悬浮窗", "Build.VERSION.SDK_INT" + Build.VERSION.SDK_INT);

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {

// android 8.0及以后使用

layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

} else {

// android 8.0以前使用

layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;

}

layoutParams.gravity = Gravity.LEFT | Gravity.TOP;

//该flags描述的是窗口的模式,是否可以触摸,可以聚焦等

layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

// 设置视频的播放窗口大小

layoutParams.width = 400;

layoutParams.height = 550;

layoutParams.x = 700;

layoutParams.y = 0;

}

@Override

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

if (show) {

showFloatingWindow();

}

return super.onStartCommand(intent, flags, startId);

}

@Override

public IBinder onBind(Intent intent) {

// TODO: Return the communication channel to the service.

return null;

}

@SuppressLint("NewApi")

private void showFloatingWindow(){

if (Settings.canDrawOverlays(this)) {

LayoutInflater layoutInflater = LayoutInflater.from(this);

display = layoutInflater.inflate(R.layout.little, null);

surfaceView = display.findViewById(R.id.texture_view);

client = new EasyPlayerClient(this, BuildConfig.KEY, surfaceView, null, null);

final EditText et = new EditText(this);

et.setHint("请输入RTMP地址");

final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

et.setText(sp.getString("url", "rtmp://111.198.38.150:10085/live/869496039536917_0001"));

client.play("rtmp://111.198.38.150:10085/live/869496039536917_0001");

windowManager.addView(display, layoutParams);

display.setOnTouchListener(new FloatingOnTouchListener());

display.setOnClickListener(new FloatingOnClickListener());

show=false;

}

}

@Override

public void onClick(View v) {

}

//点击事件

private class FloatingOnClickListener implements View.OnClickListener{

@Override

public void onClick(View v) {

if (qiehuan % 2 == 0) {

MainActivity.qiehuan();

client.stop();

client.play("rtmp://111.198.38.150:10085/live/863065035752780_0001");

} else {

MainActivity.qiehuan();

client.stop();

client.play("rtmp://111.198.38.150:10085/live/869496039536917_0001");

}

qiehuan++;

}

}

// touch移动视频窗口 | 事件拦截

private class FloatingOnTouchListener implements View.OnTouchListener {

private int x;

private int y;

@Override

public boolean onTouch(View view, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

x = (int) event.getRawX();

y = (int) event.getRawY();

isclick = false;//当按下的时候设置isclick为false

startTime = System.currentTimeMillis();

break;

case MotionEvent.ACTION_MOVE:

isclick = true;//当按钮被移动的时候设置isclick为true

int nowX = (int) event.getRawX();

int nowY = (int) event.getRawY();

int movedX = nowX - x;

int movedY = nowY - y;

Log.d("悬浮窗", "movedX = " + movedX + ", movedY =" + movedY);

x = nowX;

y = nowY;

layoutParams.x = layoutParams.x + movedX;

layoutParams.y = layoutParams.y + movedY;

windowManager.updateViewLayout(view, layoutParams);

break;

case MotionEvent.ACTION_UP:

endTime = System.currentTimeMillis();

//当从点击到弹起小于半秒的时候,则判断为点击,如果超过则不响应点击事件

if ((endTime - startTime) > 0.1 * 1000L) {

isclick = true;

Log.e("tag","拖动");

} else {

isclick = false;

Log.e("tag","点击");

}

System.out.println("执行顺序up");

break;

}

return isclick;

}

}

@Override

public void onDestroy() {

// 移除浮动框

if (windowManager != null) {

windowManager.removeView(display);

}

super.onDestroy();

}

}

别忘了在AndroidManifest.xml调用服务

Activity里开启服务(仅展示重要部分)

//判断是否授权及开启服务

@RequiresApi(api = Build.VERSION_CODES.M)

public void startFloatingService() {

if (ActivityUtil.isServiceWork(this, "com.demon.suspensionbox.FloatingService")) {//防止重复启动

Toast.makeText(this, "已启动!", Toast.LENGTH_SHORT).show();

return;

}

if (!Settings.canDrawOverlays(this)) {

Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT).show();

startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);

} else {

if (istui)

startService(new Intent(MainActivity.this, FloatingWindowService.class));

}

}

@SuppressLint("NewApi")

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// 判断获取权限是否成功

if (requestCode == 0) {

if (!Settings.canDrawOverlays(this)) {

Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();

startService(new Intent(MainActivity.this, FloatingWindowService.class));

}

}

}

//关闭服务

@Override

public void onDestroy() {

stopService(new Intent(MainActivity.this, FloatingWindowService.class));

super.onDestroy();

}

至此,就实现了一个很biu特否的视频悬浮框,更多功能还在筹备中,敬请期待

文章很短,路还漫长,大家好,我是玖玖君,一个帅气与才华并存的男人,我们下期再见。

android悬浮窗口播放动画,Android视频悬浮窗相关推荐

  1. android小窗口播放视频,[安卓] 支持投屏、电视台和小窗口的视频播放器:MoboPlayer...

    MoboPlayer 是一款国产安卓端视频播放器,和老牌播放器 MXPlayer 相比,有一些自己独特的功能,还是蛮实用的.MoboPlayer 播放视频时的界面如下,虫子为大家介绍其中几个比较有特色 ...

  2. android 小窗口播放视频播放器,[安卓] 支持投屏、电视台和小窗口的视频播放器:MoboPlayer...

    MoboPlayer 是一款国产安卓端视频播放器,和顶级播放器 MXPlayer 相比,有一些自己细腻的功能,还是蛮实用的.MoboPlayer 播放视频时的图标如下,虫子为你们介绍其中几个比较有特色 ...

  3. Android Studio 实现播放本地/网络视频

    Android Studio 实现播放本地/网络视频 目的 工具及环境 功能设计 VideoView 简介 常用方法 代码解释 本地视频播放器 activity_main.xml MainActivi ...

  4. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  5. android多个悬浮窗口的实现,android实现桌面移动悬浮窗口

    现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用. 效果图: 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相 ...

  6. Android开发之利用动画做出Activity悬浮滑动效果

    老套路看效果: 核心代码就几行: package com.example.firstapp;import android.os.Bundle; import android.view.View; im ...

  7. android x5获取播放地址,Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一)...

    Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一) 发布时间:2018-06-27 18:30, 浏览次数:1438 , 标签: Android WebVi ...

  8. android播放mp3方法,Android之MediaPlayer播放音频与视频

    本节带来的是Android多媒体中的--MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放 ...

  9. android无缝切换播放器,Android使用MediaPlayer和TextureView实现视频无缝切换

    需求描述 比如广告播放,每个视频15秒,视频之间切换的时候,性能不太好的机器可能会黑屏一段时间,体验不太好,接下来我们就是要解决这个黑屏问题. 解决方案 使用两个surfaceView方式,经过测试不 ...

最新文章

  1. liunx使用ssh免密登录
  2. FreeSwitch安装和配置记录
  3. linux java main 参数设置_Java虚拟机参数设置
  4. AFNetworking 4.x高版本上传图片,后端采用springBoot测试
  5. SpringJDBC解析3-回调函数(update为例)
  6. Windows 10如何连接和使用局域网内的打印机(非网络打印机)亲测有效、绝对管用,不定时更新!!!(更新日期2021.09.14,如有不会的可以直接私我)
  7. linux命令行 基础,Linux命令行基础,关于Bash需要知道的一些常识
  8. phpcmsV9重装 - 踩坑篇
  9. Python精确指南——第二章 界面开发
  10. (20)FPGA数据接口同步化
  11. ASP.NET 2.0中的页面输出缓存
  12. 怎样让网站显示在 Google 搜索结果中?
  13. ISIS-三类路由器区域路由
  14. matlab如何使用random函数,random函数
  15. 少林禅医:姜是无上养生物,谨慎使用大智慧
  16. java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
  17. 门头沟的《一出好戏》
  18. svg齿轮动画js特效
  19. CSGO必way电竞9月28日ESL职业联赛2组队伍前瞻
  20. oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用

热门文章

  1. proteus中的各类开关及其使用
  2. 解决T61升级T9300后报“Thermal sensor error”错误
  3. 织梦.html和htm,织梦dedecms之article_article.htm(文章内容页模板)介绍
  4. 企业文化培训课程PPT模板
  5. P1536 村村通 洛谷
  6. 架构师成长之路:如何进行服务模块拆分(架构师方法经验干货)
  7. mysqldump,select into outfile备份
  8. 中山大学 计算机学院 数字图像处理 2020 期末考试(A卷)
  9. 不是吧不是吧!Micro Focus也需要数字化转型吗?
  10. 彻底关闭win10恶心的开始菜单广告