仿UC效果:无需权限提示,实现快速搜索悬浮窗

一、效果Gif:

效果说明:点击按钮启动Service 监听剪切板。复制之后,在屏幕顶部显示一个“快速搜索”悬浮窗来显示剪贴板内容。点击悬浮窗后的操作可自定义 / 悬浮窗可自动消失。

二、WindowManager 的使用

通过WindowManager 的使用来构建我们的悬浮窗,设计模式为建造者模式。

/*** Created by cxm on 2016/8/15.*/
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;public class UcNotification {private static final int DISMISS_INTERVAL = 3000;private WindowManager mWindowManager;private WindowManager.LayoutParams mWindowParams;private View mContentView;private Context mContext;// 标记悬浮窗是否显示private boolean isShowing = false;// 自定义的监听接口private OnClickNotificationListener mOnClickNotificationListener;private TextView mTvContent;public UcNotification(Builder builder) {mContext = builder.getContext();mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);mWindowParams = new WindowManager.LayoutParams();//设置窗口类型mWindowParams.type = WindowManager.LayoutParams.TYPE_TOAST;// 系统提示windowmWindowParams.gravity = Gravity.LEFT | Gravity.TOP;mWindowParams.width = WindowManager.LayoutParams.MATCH_PARENT;mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;mWindowParams.flags =WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;mWindowParams.alpha = 0.95f;//设置进入和退出动画mWindowParams.windowAnimations = R.style.NotificationAnim;//设置窗口起点位置mWindowParams.x = 0;mWindowParams.y = 0;setContentView(mContext, builder);}private static final int HIDE_WINDOW = 0;private Handler mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {switch (msg.what) {case HIDE_WINDOW:dismiss();break;}return true;}});/**** 设置内容视图** @param context*/private void setContentView(Context context, Builder builder) {mContentView = LayoutInflater.from(context).inflate(R.layout.layout_notification, null);mTvContent = (TextView) mContentView.findViewById(R.id.tv_content);//取出builder中的内容setOnClickNotificationListener(builder.listener);setContent(builder.content);mContentView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnClickNotificationListener.onClickThenDismiss(mTvContent.getText().toString());dismiss();}});}private void setOnClickNotificationListener(OnClickNotificationListener listener) {mOnClickNotificationListener = listener;}public void show() {if (!isShowing) {isShowing = true;mWindowManager.addView(mContentView, mWindowParams);autoDismiss();}}public void dismiss() {if (isShowing) {resetState();mWindowManager.removeView(mContentView);}}/*** 重置状态*/private void resetState() {isShowing = false;}/*** 自动隐藏通知*/private void autoDismiss() {mHandler.removeMessages(HIDE_WINDOW);mHandler.sendEmptyMessageDelayed(HIDE_WINDOW, DISMISS_INTERVAL);}public void setContent(String content) {mTvContent.setText(content);}@Overridepublic void onClick(View view) {Toast.makeText(mContext,"clicked : "+mTvContent.getText().toString(),Toast.LENGTH_SHORT).show();dismiss();}public static class Builder {private Context context;private String content = "";private OnClickNotificationListener listener;public Context getContext() {return context;}public Builder setContext(Context context) {this.context = context;return this;}public Builder setOnClickNotificationListener(OnClickNotificationListener listener){this.listener = listener;return this;}public Builder setContent(String content) {this.content = content;return this;}public UcNotification build() {if (null == context)throw new IllegalArgumentException("The context is Null.");return new UcNotification(this);}}//悬浮窗点击接口public interface OnClickNotificationListener {void onClickThenDismiss(String clipString);}}

三、Service 的使用

通过Service的使用来监听剪贴板的变化,这里为了防止onPrimaryClipChanged()的重复多次调用,使用了剪贴板内容字符串的比较判断。

import android.app.Service;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;public class ClipboardService extends Service {private ClipboardManager clipboardManager;private String clipString;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(final Intent intent, int flags, int startId) {if(clipboardManager==null){clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);}if (clipString==null){clipString = "";}clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {@Overridepublic void onPrimaryClipChanged() {CharSequence text = clipboardManager.getPrimaryClip().getItemAt(0).getText();if(text!=null) {String s =text.toString();if (!TextUtils.equals(s, clipString)) {final UcNotification notification =new UcNotification.Builder().setContext(ClipboardService.this).setContent(s).setOnClickNotificationListener(new UcNotification.OnClickNotificationListener() {@Overridepublic void onClickThenDismiss(String clipString) {Toast.makeText(ClipboardService.this, "clicked:" + clipString, Toast.LENGTH_SHORT).show();Intent intent = new Intent(ClipboardService.this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);ClipboardService.this.startActivity(intent);}}).build();notification.show();}clipString = s;}}});return Service.START_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();}
}

完整项目代码:

UcTopNofitication

参考:

http://www.jianshu.com/p/634cd056b90c

仿UC客户端的快速搜索消息通知效果相关推荐

  1. 仿魅族手机消息通知效果

    转载地址:http://www.jianshu.com/users/6725c8e8194f/latest_articles 用了一年多的魅族手机了,先不说手机性能怎么样,个人是非常喜欢魅族的UI,各 ...

  2. Android 仿UC浏览器详情页评论弹框效果

    大概就这种效果 额,突然发现UC被我卸载了,这个是QQ浏览器的效果,不过都一样,如果当前页面不是全屏的话,把根布局设为相对布局,然后设置评论布局为处于底部,这样在点击评论时弹开键盘会触发布局重绘,底部 ...

  3. 浏览器如何开启消息通知

    以下是: 谷歌/火狐/搜狗/UC/QQ/360 如何开启消息通知介绍. chrome 谷歌浏览器 右上角 --> 设置 --> 找到 "网站设置" --> &qu ...

  4. 仿比心一对一直播软件源码开发,消息通知功能的实现

    在仿比心一对一直播软件源码中,消息功能起着非常重要的作用,非实时性的社交都可以通过消息功能来实现,在即时消息模块有两个基本功能就是发送消息和接收消息.我们定义如下通信指令来实现这两个功能: Push ...

  5. OpenHub——一个开源的GitHub Android客户端,快速简洁

    OpenHub 一个开源的GitHub Android客户端,快速简洁,支持GitHub主要功能,支持主题.主颜色.语言切换,SO COOL的语法高亮. 特点 App 两种登录方式,(Basic Au ...

  6. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码...

    Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...

  7. 拼团商城小程序高保真原型模板、支付、优惠券、客服、物流、收藏、足迹、优惠券、订单管理、评价、设置、地址、售后、拼团、消息通知、商城小程序、电商小程序、拼团电商、移动端电商、高保真电商、电商app

    主要功能:首页:(轮播图.活动快速入口.商品推荐).搜索 分类: 商品分类(三级显示).商品详情.拼团or单独购买.订单结算.拼团状态  消息:(客服.通知.物流.活动)我的:收藏.足迹.优惠券.订单 ...

  8. 快速掌握消息队列RabbitMQ

    ※快速掌握消息队列RabbitMQ 一.RabbitMQ概述 (一)什么是消息队列MQ 消息队列(Message Queue),后文称MQ,是一种 跨进程的通信机制,用于上下游传递消息. MQ作为消息 ...

  9. delphi 企业微信消息机器人_消息通知支持企业微信、钉钉机器人,MeterSphere v1.4.0发布...

    2020年10月27日15:00,MeterSphere v1.4版本发布说明会,现已开启官网报名. 10月27日,MeterSphere开源持续测试平台正式发布v1.4.0版本.在该版本中,Mete ...

最新文章

  1. 在C语言中解析json配置文件
  2. 《游戏脚本的设计与开发》-第一部分总结 文字脚本的功能扩展和一个游戏测试...
  3. SAP Commerce Cloud deprecation机制
  4. nodejs写html文件路径,Nodejs读取文件时相对路径的正确写法(使用fs模块)
  5. 【原理+实战+视频+源码】docker权限参数
  6. TensorFlow载入VGG并可视化每层
  7. TSqlConnection
  8. Linux设备模型 (1)
  9. 一道三角函数相关级数求和问题
  10. 昨日关注-Domain Services
  11. C程序设计 4顺序程序设计
  12. openstack nova ×××
  13. Logo设计技巧和方法
  14. C语言普通字体转换花体 英文网名神器
  15. android按住录音按钮_Android仿微信录音功能
  16. 文件下载文件中文名问题
  17. SpringBoot 教程核心功能-Web 开发(请求处理)
  18. java 针对专业技能可能会被问到的面试题
  19. 数字音视频编解码技术标准工作组会员单位
  20. OpenStreetMap在线地图数据下载(全)

热门文章

  1. 数据仓库之汇总层(DWS)设计概要
  2. Linux ls -l 命令详解
  3. 课程表计算机基础与应用实验报告,大学计算机基础实验报告3.doc
  4. 电力电子变流器和永磁同步电机模型预测控制方式实现
  5. tp703n怎么做无线打印服务器,TP-Link_TL-WR703N网络打印服务器.txt
  6. ubuntu 安装docker私服
  7. python使用rpa需要什么插件_RPA快速入门
  8. Kettle【部署 01】Linux环境 CentOS 7.5 安装配置 Kettle pdi-ce-8.3.0.0-371 及脚本调用方法实例(含安装包云盘资源1.38G+Demo源码)
  9. 鸿业铝巨人配模软件-狗牙设计
  10. i.MX6ULL终结者官方SDK简介