实现效果:

实现方法:

在自定义baseActivity里面添加viwe即可。在子activity里刷新悬浮View即可

public abstract class BaseActivity extends BaseCommonActivity {LinearLayout saoli,ewmli;ImageView imageView;private QrCodeDialog mMQrCodeDialog;public static final int SECURITY_ACTIVITY_REQUEST_DD = 30008;//需要处理全屏逻辑之类的操作,在子类重写beforeSetContentView方法做处理@Overrideprotected void beforeSetContentView() {super.beforeSetContentView();setTranslucentStatus();setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}//需要在每个Activity处理逻辑,直接在onCreate方法处理@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);createFloatActionButtons();ObServernotice.getInstance().addObserver(observer);}MyObserver observer = new MyObserver() {@Overridepublic void update(int id, int intparameter, final String string, Bitmap bitmap) {if (id==999){if (intparameter==0){saoli.setVisibility(View.GONE);ewmli.setVisibility(View.GONE);}else if (intparameter==1){saoli.setVisibility(View.VISIBLE);ewmli.setVisibility(View.VISIBLE);mMQrCodeDialog = new QrCodeDialog(BaseActivity.this) {@Overridepublic String setIvQrCode() {return QrActivity.QR_TAG_ORDER + string;}};imageView.setImageBitmap(bitmap);}}}};private void createFloatActionButtons() {View v = getWindow().getLayoutInflater().inflate(R.layout.layout_float_action_buttons, null);FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT;addContentView(v, layoutParams);saoli = findViewById(R.id.saoli);ewmli = findViewById(R.id.ewmli);imageView = findViewById(R.id.ddmaimg);initShowfloat();saoli.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {scan();}});ewmli.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMQrCodeDialog != null) {mMQrCodeDialog.show();}}});}public void initShowfloat(){int ss = ShareUtil.getSharedInt("floatint");if (ss==1){saoli.setVisibility(View.VISIBLE);ewmli.setVisibility(View.VISIBLE);}else {saoli.setVisibility(View.GONE);ewmli.setVisibility(View.GONE);}final String ewmstring =ShareUtil.getSharedString("ewmss");if (!TextUtils.isEmpty(ewmstring)){Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode(QrActivity.QR_TAG_ORDER+ewmstring,BGAQRCodeUtil.dp2px(BaseActivity.this, ResUtil.getPx(R.dimen.normal_340dp)),ContextCompat.getColor(BaseActivity.this, R.color.black), null);mMQrCodeDialog = new QrCodeDialog(BaseActivity.this) {@Overridepublic String setIvQrCode() {return QrActivity.QR_TAG_ORDER + ewmstring;}};imageView.setImageBitmap(bitmap);}}private void scan() {startActivity(QrActivity.newIntent(this, 0));}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {PermissionUtil.getInstance(getApplicationContext()).onRequestPermissionsResult(requestCode, permissions, grantResults);super.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overrideprotected void onDestroy() {super.onDestroy();ObServernotice.getInstance().removeObserver(observer);observer = null;}
}

方法二:

machine_state_view文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><FrameLayoutandroid:background="@mipmap/ic_jxz"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"android:layout_gravity="right|top"android:text="2"></TextView></FrameLayout>
</RelativeLayout>

AbstractDragFloatActionButton文件

/***meixi*/
public abstract class AbstractDragFloatActionButton extends RelativeLayout {private int parentHeight;//悬浮的父布局高度private int parentWidth;public AbstractDragFloatActionButton(Context context) {this(context, null, 0);}public AbstractDragFloatActionButton(Context context, AttributeSet attrs) {this(context, attrs, 0);}public abstract int getLayoutId();public abstract void renderView(View view);public AbstractDragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);View view= LayoutInflater.from(context).inflate(getLayoutId(), this);renderView(view);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {measureChildren(widthMeasureSpec, heightMeasureSpec);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean b, int i, int i1, int i2, int i3) {View view = getChildAt(0);view.layout(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());}private int lastX;private int lastY;private boolean isDrag;@Overridepublic boolean onTouchEvent(MotionEvent event) {int rawX = (int) event.getRawX();int rawY = (int) event.getRawY();switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:setPressed(true);//默认是点击事件isDrag=false;//默认是非拖动而是点击事件getParent().requestDisallowInterceptTouchEvent(true);//父布局不要拦截子布局的监听lastX=rawX;lastY=rawY;ViewGroup parent;if(getParent()!=null){parent= (ViewGroup) getParent();parentHeight=parent.getHeight();parentWidth=parent.getWidth();}break;case MotionEvent.ACTION_MOVE:isDrag = (parentHeight > 0 && parentWidth > 0);//只有父布局存在你才可以拖动if(!isDrag) break;int dx=rawX-lastX;int dy=rawY-lastY;//这里修复一些华为手机无法触发点击事件int distance= (int) Math.sqrt(dx*dx+dy*dy);isDrag = distance>0;//只有位移大于0说明拖动了if(!isDrag) break;float x=getX()+dx;float y=getY()+dy;//检测是否到达边缘 左上右下x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;y=y<0?0:y>parentHeight-getHeight()?parentHeight-getHeight():y;setX(x);setY(y);lastX=rawX;lastY=rawY;break;case MotionEvent.ACTION_UP://如果是拖动状态下即非点击按压事件setPressed(!isDrag);break;}//如果不是拖拽,那么就不消费这个事件,以免影响点击事件的处理//拖拽事件要自己消费return isDrag || super.onTouchEvent(event);}}

MachineStateView文件:

public class MachineStateView extends AbstractDragFloatActionButton {public static final String TAG = MachineStateView.class.getSimpleName();public MachineStateView(Context context) {super(context);}public MachineStateView(Context context, AttributeSet attrs) {super(context, attrs);}public MachineStateView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic int getLayoutId() {return R.layout.machine_state_view;//拿到你自己定义的悬浮布局}@Overridepublic void renderView(View view) {//初始化那些布局Log.e(TAG,"MachineStateView" + view.getId());}
}

引用MachineStateView即可

实现demo:https://download.csdn.net/download/meixi_android/12568936

在线bug交流:扣1085220040

Android 全局悬浮按钮,悬浮按钮点击事件相关推荐

  1. jQuery动态添加按钮,绑定点击事件失效

    jQuery动态添加按钮,绑定点击事件失效 因为需求需要给页面动态添加按钮并绑定点击事件进行操作, 但是发现绑定的点击事件失效. 原因分析: append中的节点是在整个文档加载完之后开始添加,因此页 ...

  2. 2023-02-24 Android app java 模拟控件点击事件,使用performClick方法去实现

    一.Android app java 模拟控件点击事件,使用performClick方法去实现. 二.实际使用 private TextView m_bt_connect ;m_bt_connect ...

  3. javascript动态生成按钮并绑定点击事件

    前一个多月公司的前端开发人员离职,公司一直在招前端,基本上每天都有几个来面试的人,就这个面试频率,也才招了一个多月才招到.绝大部分都是死在了一道上机面试提上.题目很基础,但也很考基本功,基本上才3%左 ...

  4. IOS开发UISearchBar失去第一响应者身份后,取消按钮不执行点击事件的问题

    在iOS开发中,使用UISearchBar的时候,当搜索框失去焦点的时候,取消按钮是默认不能点击的,如图按钮的颜色是灰色的:    这是因为此时取消按钮的enabled属性被设置为NO了,那么当我们需 ...

  5. datatables 自定义按钮及响应点击事件

    按钮 {"targets": -1,"class": "but_xq","data": null,"bSort ...

  6. 更简单的方法实现el-calendar日历组件中点击上个月、今天、下个月按钮时的点击事件

    网上查el-calendar相关的按钮点击事件文章,清一色都是在mounted挂载阶段通过document.querySelector绑定类名添加点击事件. 我想说为啥要弄得这么麻烦?el-calen ...

  7. uniapp使用悬浮窗组件添加点击事件的处理方法以及拖拽出界的问题

    小程序/H5悬浮窗组件 基本介绍 当我们开发小程序或这app端的时候,有时候会遇到悬浮窗的需求.如果用原生Js写会异常的复杂,所以使用那些大佬们已经开发好的组件会使开发变得异常的简洁. 我刚来亚信实习 ...

  8. Element日历区分上个月下个月等按钮和日期点击事件

    文章目录 前言 解决办法 给日历中的`tbody`元素添加点击事件: 其他思路 watch监听日历绑定数据变化实现更新数据: 给上个月,下个月,今天三个按钮添加点击事件: 前言 前言:最近做个酒店管理 ...

  9. 鼠标移入或悬浮禁用图标,点击事件不生效

    <div style="cursor: not-allowed;cursor: no-drop;"><div @click="getData()&quo ...

  10. android让跟布局优先响应点击事件,andorid事件监听的五种方式

    一.Android中的事件处理方法 事件处理:响应用户UI动作,提高应用程序交互性 1.基于监听的事件处理机制 2.基于回调的事件处理机制 3.Handler消息处理 二.基于监听的事件处理机制详解 ...

最新文章

  1. jquery validate使用
  2. linux每天进步一点点-7月22日
  3. StreamBox Ripper 将rm转mp3时候出现g2支持的问题
  4. python颜色填充随机_使用python中的随机数据填充mysql表
  5. ROS学习之节点间话题通信的
  6. eclipse解决Android Library Project jar包重复导致的问题
  7. ASP.NET Core 3.0 gRPC 双向流
  8. 博客园的博客终于开通了
  9. 【HDU - 2089 】不要62 (dp)
  10. 雷军卸任小米电子董事长!常程等人也退出该公司 网友:为造车放弃家业?
  11. 最困难的是带着自己的选择生活下去
  12. 文件格式、后缀名、图片格式详解
  13. C/C++ _beginthreadex 多线程操作 - 线程同步
  14. 网站ICP备案和公安备案流程
  15. 高等数学:多元函数微分学
  16. 最全电商分类信息(10)
  17. 只使用适用于DatetimeIndex的方法
  18. vue.js动态计时器_基于Vue.js的Pomodoro技术计时器
  19. EasyExcel 动态表头 + 数据单元格合并
  20. linux设置sfq队列参数,Linux内核中流量控制(5)

热门文章

  1. [html] 你是如何区分HTML和HTML5的?
  2. [css] css中的baseline,你知道吗?
  3. [js] 一道变态题 Number.call.call(Number, undefined, 0) 等于什么?
  4. 前端学习(2650):composition组件
  5. 前端学习(2538):slice
  6. 前端学习(1247):购物车1
  7. 前端学习(554):node实现登录和注册第二部分代码
  8. spring mvc学习(53):回顾和springmvc返回值类型总结
  9. java学习(59):static修饰内部类
  10. Mac OS X 安装和配置ngrok