Android 全局悬浮按钮,悬浮按钮点击事件

实现效果:

 

 

实现方法:

 在自定义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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13-Flutter移动电商实战-ADBanner组件的编写

1、AdBanner组件的编写 我们还是把这部分单独出来&#xff0c;需要说明的是&#xff0c;这个Class你也是可以完全独立成一个dart文件的。代码如下&#xff1a; 广告图片class AdBanner extends StatelessWidget { final String advertesPicture; AdBanner({Key key, this.adv…

android远程调试工具,android投屏工具

远程调试工具 说明&#xff1a;远程对方电脑需下载安装两个软件&#xff1a;Android studio 和向日葵 android投屏工具 说明&#xff1a;涉及硬件开发时&#xff0c;有的硬件没有安卓屏&#xff0c;可以使用 两个工具exe文件下载连接&#xff1a; https://download.csdn.net/…

14-Flutter移动电商实战-ADBanner组件的编写

拨打电话的功能在app里也很常见&#xff0c;比如一般的外卖app都会有这个才做。其实Flutter本身是没给我们提供拨打电话的能力的&#xff0c;那我们如何来拨打电话那? 1、编写店长电话模块 这个小伙伴们一定轻车熟路了&#xff0c;我也就不再多介绍吧。直接看代码&#xff0c;…

Android 捕获异常,上报异常日志,捕获奔溃日志,bugly使用实例

1、登录腾讯bugly平台创建应用 腾讯Bugly - 一种愉悦的开发方式 _android anr_android anr分析_iOS崩溃日志分析平台 2、1加载依赖 /*崩溃处理 */ implementation com.tonystark.android:defense_crash:2.0.0 //bugly implementation com.tencent.bugly:crashreport_upgrade:1.…

Android 获取天气数据

/** * 天气API * param cityname * return */ private String getUrl(String cityname){ return "http://wthrcdn.etouch.cn/weather_mini?city"cityname; } 传入城市&#xff0c;即可返回天气数据

windows下dos窗口实现持续ping显示时间保存至日志

效果图 右击新建 ping.bat 文件&#xff08;ping为文件名称&#xff0c;随便起&#xff09;&#xff0c;内容如下&#xff1a; cscript ping.vbs 127.0.0.1 -t >log.txt127.0.0.1 修改为你自己的ip地址&#xff0c;log 为记录日志的文件名 右击新建 ping.vbs 文件&#x…

AndroidStudio中Flutter打包APK

1、生成签名文件 在打包之前我们需要一个签名文件&#xff0c;证明文件的唯一性。 keytool -genkey -v -keystore F:\APP\sign.jks -keyalg RSA -keysize 2048 -validity 10000 -alias signF:\APP\sign.jks为签名问价存放目录&#xff0c;sign 为密钥名。 后面都有用&#x…

Codeforces #471

C(分段) 题意&#xff1a; 分析&#xff1a; 我们分别考虑p2和p>3的情况  当p2的时候&#xff0c;个数明显是[L,R]内完全平方数的个数 当p>3的时候&#xff0c;我们注意到这样的数字个数是1e6级别的&#xff0c;且a最多也不超过1e6 我们可以对于每个a去枚举对应的p&…

Thinkpad Access Connections实现快速的在各种网络间进行切换

Thinkpad Access Connections快速的在各种网络间进行切换因为工作的原因要经常在多个无线或有线之间切换&#xff0c;每次要切换到不同的固定IP地址的网络更是一种折磨&#xff0c;换一次就要从新输入一次IP地址&#xff0c;Windows下有没有像Linux的NetworkManage那样的网络管…

15-Flutter移动电商实战-商品推荐区域制作

1、推荐商品类的编写 这个类接收一个List参数&#xff0c;就是推荐商品的列表&#xff0c;这个列表是可以左右滚动的。 /*商品推荐*/class Recommend extends StatelessWidget { final List recommendList; Recommend({Key key, this.recommendList}) : super(key: key);} 2…

gradle sync failed——Android studio 突然就无法自动下载gradle了

不知道按到了什么鬼&#xff0c;或者新安装了Android studio 无法使用 正常gradle文件位置是不需要修改的 android studio会自动配置 出现这个错误&#xff0c;就需要收到补全gradle文件路径配置即可 1、查看项目gradle版本 2、补全即可——加上后面这段对应项目里的版本的文件…

Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。——持续更新中

粘包解决方法 方法1 getXOR——是校验方法 /*** 最小数据包的长度(除开数据的N个字节&#xff09;* 帧头 保留字节 协议控制字 地址字段 命令长度 命令码 命令数据 校验和* 2字节 3字节 1字节 2或8字节 2字节 2字节 0-1100字…

17-Flutter移动电商实战-首页_楼层区域的编写

1、楼层标题组件 该组件非常简单&#xff0c;只接收一个图片地址&#xff0c;然后显示即可&#xff1a; class FloorTitle extends StatelessWidget {final String picture_address;FloorTitle({this.picture_address});overrideWidget build(BuildContext context) {return …