在现代移动应用开发中,Android悬浮窗技术被广泛应用于各种场景,悬浮窗可以显示在手机桌面上,提供便捷的实时信息和交互体验,本文将详细介绍如何通过实现一个悬浮窗来显示录屏时间的控制效果,以下是具体实现步骤和技术细节。
一、悬浮窗布局设计
悬浮窗的布局文件record_screen_time_float.xml
如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/corners_bg" android:paddingBottom="3dp" android:paddingTop="3dp" android:paddingLeft="15dp" android:paddingRight="8dp" android:layout_gravity="center" android:gravity="center"> <TextView android:id="@+id/record_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00" android:textColor="#ffffff" android:textSize="10dp" /> <View android:layout_width="2dp" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="#ffffff" /> <LinearLayout android:id="@+id/stop_record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/record_hint_button" android:layout_width="10dp" android:layout_height="10dp" android:layout_marginRight="5dp" android:background="#FF4040" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="结束" android:textColor="#ffffff" android:textSize="10dp" /> </LinearLayout> </LinearLayout> </LinearLayout>
该布局包含三个主要部分:
1、时间显示(TextView record_time
):显示当前录屏时长。
2、分隔线(View
):用于视觉上的分隔。
3、结束按钮(LinearLayout stop_record
):包含一个红色提示按钮和一个“结束”文本,用于停止录屏操作。
二、悬浮窗服务实现
为了管理悬浮窗,我们需要创建一个后台服务FloatWindowService
,并在其中启动一个线程或Handler来持续更新时间,以下是一个简单的服务类示例:
public class FloatWindowService extends Service { private WindowManager windowManager; private View floatView; private TextView recordTime; private CountDownTimer countDownTimer; private long totalTimeInMilliseconds = 3600000; // 假设总时间为1小时 @Override public void onCreate() { super.onCreate(); initFloatView(); addFloatViewToWindow(); } private void initFloatView() { // 加载悬浮窗布局 LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); floatView = inflater.inflate(R.layout.record_screen_time_float, null); recordTime = floatView.findViewById(R.id.record_time); // 设置初始时间 updateRecordTime(); } private void addFloatViewToWindow() { // 创建窗口参数 WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; layoutParams.format = PixelFormat.TRANSLUCENT; layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.x = 0; layoutParams.y = 0; windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); windowManager.addView(floatView, layoutParams); } private void updateRecordTime() { long minutes = TimeUnit.MILLISECONDS.toMinutes(totalTimeInMilliseconds); long seconds = TimeUnit.MILLISECONDS.toSeconds(totalTimeInMilliseconds) TimeUnit.MINUTES.toSeconds(minutes); recordTime.setText(String.format("%02d:%02d", minutes, seconds)); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); // 启动计时器 countDownTimer = new CountDownTimer(totalTimeInMilliseconds, 1000) { @Override public void onTick(long millisUntilFinished) { totalTimeInMilliseconds = millisUntilFinished; updateRecordTime(); } @Override public void onFinish() { countDownTimer.cancel(); // 停止计时后的操作,例如移除悬浮窗等 } }.start(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); if (countDownTimer != null) { countDownTimer.cancel(); } if (windowManager != null && floatView != null) { windowManager.removeView(floatView); } } }
三、权限配置与启动服务
要在Android设备上显示悬浮窗,需要在AndroidManifest.xml
中添加相应的权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
还需要声明服务:
<service android:name=".FloatWindowService"/>
启动服务的代码示例:
Intent serviceIntent = new Intent(this, FloatWindowService.class); startService(serviceIntent);
四、常见问题与解答
问题1:如何在Android 12及以上版本显示悬浮窗?
答:从Android 12开始,系统默认禁用了在录屏时显示悬浮窗的功能,为了在录屏时显示悬浮窗,可以在应用中添加以下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; params.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.format = PixelFormat.TRANSLUCENT; windowManager.addView(floatView, params); } else { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_PHONE_SHORTCUT; params.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.format = PixelFormat.TRANSLUCENT; windowManager.addView(floatView, params); }
此代码确保在不同版本的Android系统中都能正确显示悬浮窗。
问题2:如何在悬浮窗中动态更新时间?
答:在FloatWindowService
中使用CountDownTimer
来动态更新时间,每次计时器触发时,调用updateRecordTime()
方法更新TextView
,具体实现如上文所述。
小伙伴们,上文介绍了“android桌面悬浮窗显示录屏时间控制效果”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/631443.html