android桌面悬浮窗显示录屏时间控制效果

本文实例为大家分享了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"> 

  <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"
    android:orientation="horizontal"> 

    <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:textColor="#ffffff" />
    <LinearLayout
      android:id="@+id/stop_record"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:gravity="center"
      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> 

悬浮窗是在service中拉起可以根据个人需要修改

package com.android.systemui; 

import android.annotation.TargetApi;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator; 

import android.graphics.PixelFormat;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.android.systemui.R;
import android.util.Log;
import java.io.File;
import java.io.IOException; 

public class ScreenRecordService extends Service implements Handler.Callback { 

  private final String TAG = "ScreenRecordService";
  private Handler mHandler;
  //已经录制多少秒了
  private int mRecordSeconds = 0;
  private static final int MSG_TYPE_COUNT_DOWN = 110; 

  /**
   * 定义浮动窗口布局
   */
  LinearLayout mlayout;
  TextView recordTime;
  /**
   * 悬浮窗控件
   */
  ImageView recordHintButton;
  LinearLayout stopRecord;
  /**
   * 悬浮窗的布局
   */
  WindowManager.LayoutParams wmParams;
  LayoutInflater inflater;
  /**
   * 创建浮动窗口设置布局参数的对象
   */
  WindowManager mWindowManager; 

  //触摸监听器
  GestureDetector mGestureDetector; 

  FloatingListener mFloatingListener; 

  @Override
  public void onCreate() {
    super.onCreate();
   initWindow();//设置窗口的参数
   initFloating();//设置悬浮窗图标
 }
  @Override
  public void onDestroy() {
    super.onDestroy();
    try {
      if (mlayout != null) {
        // 移除悬浮窗口
        mWindowManager.removeView(mlayout);
      }
    } catch (Exception e) {
      Log.e(TAG, "not attached to window manager");
    }
  } 

  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  @Override
  public boolean handleMessage(Message msg) {
    switch (msg.what) { 

      case MSG_TYPE_COUNT_DOWN: { 

        mRecordSeconds++;
        int minute = 0, second = 0;
        if (mRecordSeconds >= 60) {
          minute = mRecordSeconds / 60;
          second = mRecordSeconds % 60;
        } else {
          second = mRecordSeconds;
        } String timeTip = ""+minute+":"+second;
        recordTime.setText(timeTip);
      }
        break;
      }
    }
    return true;
  } 

  /**
   * 初始化windowManager
   */
  private void initWindow() {
    if (mWindowManager == null) {
      mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
    }
    wmParams = getParams(wmParams);//设置好悬浮窗的参数
    // 悬浮窗默认显示以左上角为起始坐标
    wmParams.gravity = Gravity.LEFT | Gravity.TOP;
    //悬浮窗的开始位置,因为设置的是从左上角开始,所以屏幕左上角是x=0;y=0
    wmParams.x = 0;
    wmParams.y = 0;
    //得到容器,通过这个inflater来获得悬浮窗控件
    if (inflater == null) {
      inflater = LayoutInflater.from(getApplication());
    }
    // 获取浮动窗口视图所在布局
    if (mlayout == null) {
      mlayout = (LinearLayout) inflater.inflate(R.layout.record_screen_time_float, null);
    }
    // 添加悬浮窗的视图
    mWindowManager.addView(mlayout, wmParams);
  } 

  /**
   * 对windowManager进行设置
   *
   * @param wmParams
   * @return
   */
  public WindowManager.LayoutParams getParams(WindowManager.LayoutParams wmParams) {
    if (wmParams == null) {
      wmParams = new WindowManager.LayoutParams();
    }
    //设置window type 下面变量2002是在屏幕区域显示,2003则可以显示在状态栏之上
    //wmParams.type = LayoutParams.TYPE_PHONE;
    //wmParams.type = LayoutParams.TYPE_SYSTEM_ALERT;
    wmParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
    //设置图片格式,效果为背景透明
    wmParams.format = PixelFormat.RGBA_8888;
    //设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
    //wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
    //设置可以显示在状态栏上
    wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR |
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
    //设置悬浮窗口长宽数据
    wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
    wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
    return wmParams;
  } 

  /**
   * 找到悬浮窗的图标,并且设置事件
   * 设置悬浮窗的点击、滑动事件
   */
  private void initFloating() {
    recordTime = (TextView) mlayout.findViewById(R.id.record_time);
    recordHintButton = (ImageView) mlayout.findViewById(R.id.record_hint_button);
    setFlickerAnimation(recordHintButton);
    stopRecord = (LinearLayout) mlayout.findViewById(R.id.stop_record);
    mlayout.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Log.d(TAG, "OnClickListener");
        ScreenUtil.stopScreenRecord(ScreenRecordService.this);
      }
    });
    if (mGestureDetector == null) {
      mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
    }
    if(mFloatingListener == null){
      //设置监听器
      mFloatingListener = new FloatingListener();
    }
    mlayout.setOnTouchListener(mFloatingListener);
    stopRecord.setOnTouchListener(mFloatingListener);
  }
/×
 ×录屏状态显示(闪烁效果)
 ×/
  private void setFlickerAnimation(ImageView iv_chat_head) {
    final Animation animation = new AlphaAnimation(1, 0); // Change alpha from fully visible to invisible
    animation.setDuration(500); // duration - half a second
    animation.setInterpolator(new LinearInterpolator()); // do not alter animation rate
    animation.setRepeatCount(Animation.INFINITE); // Repeat animation infinitely
    animation.setRepeatMode(Animation.REVERSE); //
    iv_chat_head.setAnimation(animation);
  } 

  //开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标)
  private int mTouchStartX, mTouchStartY, mTouchCurrentX, mTouchCurrentY;
  //开始时的坐标和结束时的坐标(相对于自身控件的坐标)
  private int mStartX, mStartY, mStopX, mStopY;
  private boolean isMove;//判断悬浮窗是否移动 

  /**
   * 悬浮窗监听器
   */
  private class FloatingListener implements OnTouchListener { 

    @Override
    public boolean onTouch(View arg0, MotionEvent event) { 

      int action = event.getAction();
      switch (action) {
        case MotionEvent.ACTION_DOWN:
          isMove = false;
          mTouchStartX = (int) event.getRawX();
          mTouchStartY = (int) event.getRawY();
          mStartX = (int) event.getX();
          mStartY = (int) event.getY();
          break;
        case MotionEvent.ACTION_MOVE:
          mTouchCurrentX = (int) event.getRawX();
          mTouchCurrentY = (int) event.getRawY();
          wmParams.x += mTouchCurrentX - mTouchStartX;
          wmParams.y += mTouchCurrentY - mTouchStartY;
          if (mlayout != null) {
            mWindowManager.updateViewLayout(mlayout, wmParams);
          }
          mTouchStartX = mTouchCurrentX;
          mTouchStartY = mTouchCurrentY;
          break;
        case MotionEvent.ACTION_UP:
          mStopX = (int) event.getX();
          mStopY = (int) event.getY();
          if (Math.abs(mStartX - mStopX) >= 1 || Math.abs(mStartY - mStopY) >= 1) {
            isMove = true;
          }
          break;
      }
      return mGestureDetector.onTouchEvent(event); //此处必须返回false,否则OnClickListener获取不到监听
    }
  } 

  /**
   * 自定义的手势监听类
   */
  class MyOnGestureListener extends SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
      if (!isMove) {
        System.out.println("onclick");
      }
      return super.onSingleTapConfirmed(e);
    }
  } 

} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码

    Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置LayoutParams(android.view.WindowManager.LayoutParams.LayoutParams())属性,默认是屏蔽View区域以外的所有点击事件,即在显示View的时候,屏幕的其它区域都不可点击,包括菜单和返回键等. 当给LayoutParams设置合适的flag后,其它区域就可以响应点击了. 示例代码: /** * 创

  • 不依赖于Activity的Android全局悬浮窗的实现

    前言 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口).那么这种不受Activity界面影响的悬浮窗口是怎么实现的呢? Android悬浮窗实现 实现基础 Android悬浮窗实现使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_S

  • Android中悬浮窗口的实现原理实例分析

    本文实例讲述了Android中悬浮窗口的实现原理.分享给大家供大家参考.具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮

  • Android实现类似360,QQ管家那样的悬浮窗

    一.前言: 我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹弓那,然后,松手,鸟就飞出去.这个过程是动画过程,做的事,实际上是清楚内存. 二:原理: 其实,没什么原理,用到的就是WindowManager以及WindowManager.LayoutParams,对这个LayoutParams做文章,当设置为属性后,然后,创建一个View,将这个View添加到W

  • Android应用内悬浮窗的实现方案示例

    1.悬浮窗的基本介绍 悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity.Toast.Dialog,都不过是通过WindowManagerGlobal.addView()添加的一个个View. Android中的窗口分为三个级别: 1.1 应用窗口,比如Activity的窗口; 1.2 子窗口,依赖于父窗口,比如PopupW

  • Android 悬浮窗权限各机型各系统适配大全(总结)

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时. 悬浮窗适配 悬浮窗适配有两种方法:第一种是按照正规的流程,如果系统没有赋予 APP 弹出悬浮窗的权限,就先跳转到权限授权界面,等用户打开该权限之后,再去弹出悬浮窗,比如 QQ 等一些主流应用就是这么做得:第二种就是利用系统的漏洞,绕过权限的申请,简单粗暴,这种方法我不是特别建议,但是现在貌似有些

  • android 添加随意拖动的桌面悬浮窗口

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍,如果还没看过的赶快稳步看一下哦. 2.使用windowManager往最顶层添加一个View .这个知识点就是为本文主要讲解的内容哦.在本文的讲解中,我们还会讲到下面的知识点: a.如果获取到状态栏的高度 b.悬浮窗口的拖动 c.悬浮窗口的点击事件 有开始之前,我们先来看一下效果图:  接下来我们来

  • android编程实现悬浮窗体的方法

    本文实例讲述了android编程实现悬浮窗体的方法.分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用权限: 复制代码 代码如下: <uses-permission android:name="android.permission

  • Android实现桌面悬浮窗、蒙板效果实例代码

    现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作. 今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的服务类,主要负责在后台不断的刷新桌面上的小悬浮窗口,否则会导致更换界面之后,悬浮窗口也会随

  • 详解android6.0版本下悬浮窗实现

    悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓6.0手机上才发现,原来在6.0手机上不是行的. 第一反应肯定是权限相关问题,做了相关处理后,果然让悬浮窗原形毕露了.直接贴代码. public class MainActivity extends AppCompatActivity { private static final int ALERT_WINDOW_PERMISSION_CODE = 100; private Button start_float; @O

随机推荐