android悬浮窗口播放动画,Android视频悬浮窗
这个悬浮窗是一个类似于微信通话的小屏视频框,利于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视频悬浮窗相关推荐
- android小窗口播放视频,[安卓] 支持投屏、电视台和小窗口的视频播放器:MoboPlayer...
MoboPlayer 是一款国产安卓端视频播放器,和老牌播放器 MXPlayer 相比,有一些自己独特的功能,还是蛮实用的.MoboPlayer 播放视频时的界面如下,虫子为大家介绍其中几个比较有特色 ...
- android 小窗口播放视频播放器,[安卓] 支持投屏、电视台和小窗口的视频播放器:MoboPlayer...
MoboPlayer 是一款国产安卓端视频播放器,和顶级播放器 MXPlayer 相比,有一些自己细腻的功能,还是蛮实用的.MoboPlayer 播放视频时的图标如下,虫子为你们介绍其中几个比较有特色 ...
- Android Studio 实现播放本地/网络视频
Android Studio 实现播放本地/网络视频 目的 工具及环境 功能设计 VideoView 简介 常用方法 代码解释 本地视频播放器 activity_main.xml MainActivi ...
- 视频教程-FFmpeg打造Android万能音频播放器-Android
FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...
- android多个悬浮窗口的实现,android实现桌面移动悬浮窗口
现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用. 效果图: 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相 ...
- Android开发之利用动画做出Activity悬浮滑动效果
老套路看效果: 核心代码就几行: package com.example.firstapp;import android.os.Bundle; import android.view.View; im ...
- android x5获取播放地址,Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一)...
Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一) 发布时间:2018-06-27 18:30, 浏览次数:1438 , 标签: Android WebVi ...
- android播放mp3方法,Android之MediaPlayer播放音频与视频
本节带来的是Android多媒体中的--MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放 ...
- android无缝切换播放器,Android使用MediaPlayer和TextureView实现视频无缝切换
需求描述 比如广告播放,每个视频15秒,视频之间切换的时候,性能不太好的机器可能会黑屏一段时间,体验不太好,接下来我们就是要解决这个黑屏问题. 解决方案 使用两个surfaceView方式,经过测试不 ...
最新文章
- liunx使用ssh免密登录
- FreeSwitch安装和配置记录
- linux java main 参数设置_Java虚拟机参数设置
- AFNetworking 4.x高版本上传图片,后端采用springBoot测试
- SpringJDBC解析3-回调函数(update为例)
- Windows 10如何连接和使用局域网内的打印机(非网络打印机)亲测有效、绝对管用,不定时更新!!!(更新日期2021.09.14,如有不会的可以直接私我)
- linux命令行 基础,Linux命令行基础,关于Bash需要知道的一些常识
- phpcmsV9重装 - 踩坑篇
- Python精确指南——第二章 界面开发
- (20)FPGA数据接口同步化
- ASP.NET 2.0中的页面输出缓存
- 怎样让网站显示在 Google 搜索结果中?
- ISIS-三类路由器区域路由
- matlab如何使用random函数,random函数
- 少林禅医:姜是无上养生物,谨慎使用大智慧
- java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
- 门头沟的《一出好戏》
- svg齿轮动画js特效
- CSGO必way电竞9月28日ESL职业联赛2组队伍前瞻
- oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
热门文章
- proteus中的各类开关及其使用
- 解决T61升级T9300后报“Thermal sensor error”错误
- 织梦.html和htm,织梦dedecms之article_article.htm(文章内容页模板)介绍
- 企业文化培训课程PPT模板
- P1536 村村通 洛谷
- 架构师成长之路:如何进行服务模块拆分(架构师方法经验干货)
- mysqldump,select into outfile备份
- 中山大学 计算机学院 数字图像处理 2020 期末考试(A卷)
- 不是吧不是吧!Micro Focus也需要数字化转型吗?
- 彻底关闭win10恶心的开始菜单广告