悬浮球
android自带的FloatingActionButton没有拖拽功能,因此可以给它加上这个功能。
直接上代码:

public class DragFloatActionButton extends FloatingActionButton{private int parentHeight;private int parentWidth;public DragFloatActionButton(Context context) {super(context);}public DragFloatActionButton(Context context, AttributeSet attrs) {super(context, attrs);}public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}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:if(parentHeight<=0||parentWidth==0){isDrag=false;break;}else {isDrag=true;}int dx=rawX-lastX;int dy=rawY-lastY;//这里修复一些华为手机无法触发点击事件int distance= (int) Math.sqrt(dx*dx+dy*dy);if(distance==0){isDrag=false;break;}float x=getX()+dx;float y=getY()+dy;//检测是否到达边缘 左上右下x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;y=getY()<0?0:getY()+getHeight()>parentHeight?parentHeight-getHeight():y;setX(x);setY(y);lastX=rawX;lastY=rawY;Log.i("aa","isDrag="+isDrag+"getX="+getX()+";getY="+getY()+";parentWidth="+parentWidth);break;case MotionEvent.ACTION_UP:if(!isNotDrag()){//恢复按压效果setPressed(false);//Log.i("getX="+getX()+";screenWidthHalf="+screenWidthHalf);if(rawX>=parentWidth/2){//靠右吸附animate().setInterpolator(new DecelerateInterpolator()).setDuration(500).xBy(parentWidth-getWidth()-getX()).start();}else {//靠左吸附ObjectAnimator oa=ObjectAnimator.ofFloat(this,"x",getX(),0);oa.setInterpolator(new DecelerateInterpolator());oa.setDuration(500);oa.start();}}break;}//如果是拖拽则消s耗事件,否则正常传递即可。return !isNotDrag() || super.onTouchEvent(event);}private boolean isNotDrag(){return !isDrag&&(getX()==0||(getX()==parentWidth-getWidth()));}
}

layout中使用DragFloatActionButton

<DragFloatActionButtonandroid:id="@+id/floatBall"  android:layout_width="wrap_content"android:layout_height="wrap_content"app:backgroundTint="@drawable/fab"          --->正常背景颜色,默认使用colorAccent的颜色app:rippleColor="#ffffff"                   --->按下时背景颜色app:elevation="6dp"                         --->正常阴影大小app:pressedTranslationZ="12dp"              --->按下时阴影大小app:borderWidth="0dp"                       --->边框大小app:fabCustomSize="60dp"                    --->fab大小app:maxImageSize="50dp"                     --->src图片的大小android:src="@drawable/circle"android:clickable="true"                    --->点击效果app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/>

最重要的事情!!!一定要给DragFloatActionButton设置点击事件,否则不能拖拽!
完整代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {//悬浮球private DragFloatActionButton floatBall;//弹窗private PopupWindow popup;//弹窗菜单Viewprivate View menuView;//菜单上面的组件private TextView menuTime;private TextView menuPhone;private TextView menuAirCondition;private TextView menuLight;private TextView menuAir;private TextView menuITPower;private TextView menuMusic;private TextView menuLog;private TextView menuSetting;private TextView menuMain;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}//初始化viewprivate void initView() {floatBall = findViewById(R.id.floatBall);menuView = LayoutInflater.from(this).inflate(R.layout.float_menu, null);menuTime = menuView.findViewById(R.id.menu_time);menuPhone = menuView.findViewById(R.id.menu_phone);menuAirCondition = menuView.findViewById(R.id.menu_airCondition);menuLight = menuView.findViewById(R.id.menu_lighting);menuAir = menuView.findViewById(R.id.menu_air);menuITPower = menuView.findViewById(R.id.menu_power);menuMusic = menuView.findViewById(R.id.menu_music);menuLog = menuView.findViewById(R.id.menu_log);menuSetting = menuView.findViewById(R.id.menu_setting);menuMain = menuView.findViewById(R.id.menu_main);menuTime.setOnClickListener(this);menuPhone.setOnClickListener(this);menuAirCondition.setOnClickListener(this);menuLight.setOnClickListener(this);menuAir.setOnClickListener(this);menuITPower.setOnClickListener(this);menuMusic.setOnClickListener(this);menuLog.setOnClickListener(this);menuSetting.setOnClickListener(this);menuMain.setOnClickListener(this);floatBall.setOnClickListener(this);}//显示Viewprivate void showView() {DisplayMetrics dm = getResources().getDisplayMetrics();popup = new PopupWindow(menuView, (int) (dm.widthPixels * 0.7), (int) (dm.heightPixels * 0.5));Drawable transpent = new ColorDrawable(Color.TRANSPARENT);popup.setBackgroundDrawable(transpent);popup.setFocusable(true);popup.setOutsideTouchable(true);popup.showAtLocation(floatBall, Gravity.CENTER, 0, 0);popup.update();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.floatBall:showView();break;default: break;}}}

浮动菜单窗口透明化

android:alpha="0.8"

直播APP源码可拖拽悬浮球,仿Assistive Touch弹出窗口相关推荐

  1. 直播网站源码可拖拽悬浮球,仿Assistive Touch弹出窗口

    悬浮球 android自带的FloatingActionButton没有拖拽功能,因此可以给它加上这个功能. 直接上代码: public class DragFloatActionButton ext ...

  2. 可拖拽悬浮球,仿Assistive Touch弹出窗口

    可拖拽悬浮球,仿Assistive Touch弹出窗口 悬浮球 layout中使用DragFloatActionButton 最重要的事情!!!一定要给DragFloatActionButton设置点 ...

  3. 视频直播app源码,底部动画导航栏

    视频直播APP源码实现底部导航栏并点击切换页面可简述为有三种方式 TabBar + TabBarView BottomNavigationBar + BottomNavigationBarItem 自 ...

  4. 视频直播APP源码,通过css控制div内容展开更多/收起效果

    视频直播APP源码,通过css控制div内容展开更多/收起效果 一. 实现思路 需要设置一个变量控制展开 / 收起效果 提前写好最高高度的class样式,超出这个高度多余内容会隐藏 只有在列表数据长度 ...

  5. 视频直播APP源码开发iOS音频播放流程

    视频直播APP源码开发iOS音频播放流程 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的, ...

  6. 直播app源码,matlab 色彩布局描述符

    直播app源码,matlab 色彩布局描述符 %color layout descriptor (CLD) %im = imread('cs.jpg'); function result = CLD( ...

  7. 双子星IPTV桌面APK源码 网络电视机顶盒直播APP源码 带php后台

    介绍: 后台添加多格式在线直播源 带后台搭建视频教程 双子星IPTV桌面APK源码 网络电视机顶盒直播APP源码 带php后台 再手机上面即可看直播电视 电影 简单方便 网盘下载地址: http:// ...

  8. 一对一直播app源码,Aandroid动态切换主题色

    一对一直播app源码,Aandroid动态切换主题色实现的相关代码 点击按钮变量存储切换状态: override fun onClick(v: View?) {when (v?.id) {R.id.b ...

  9. 视频直播APP源码在安卓中推送SDK集成居然如此简单!

    视频直播APP源码在安卓中推送SDK集成居然如此简单! 思维导图 详细步骤 下载 demo 我的师傅大鸟哥告诉我,集成各类 SDK 的第一步骤都是下载个 Demo,先把 Demo 跑起来看看是什么鬼. ...

最新文章

  1. Android之解析Android Map地图返回的Json数据
  2. Zencart获取PayPal PDT Token参数教程方法
  3. 浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务)
  4. 打印表单_超市生鲜常用表单,打印出来直接用!(可收藏)
  5. 最长公共子序列和追踪解
  6. Oulipo HDU - 1686(哈希或KMP)匹配字符串
  7. 开发日记:接口开发设计
  8. 1.8 zip和unzip
  9. SQL Server性能常用语句
  10. 2019.04.07 电商12 登录界面的验证
  11. centos rm -rf 恢复删除的文件
  12. vsscanf用法解析
  13. VS(Visual Studio)间接引用
  14. Python 玩转数据 19 - 数据操作 正则表达式 Regular Expressions 搜索模式匹配
  15. vlookup+left函数嵌套如何运用
  16. Unity 遮挡剔除
  17. 一行代码教你七夕情人节如何告白❤—动漫3D相册(音乐+文字)HTML+CSS+JavaScript
  18. 技术科普:虚拟现实系统
  19. java编程个人总结_java个人总结
  20. 泛型中extends和super的区别

热门文章

  1. mysql安装服务:Internal error (值不能为null.参数名:path1)The installer will now close
  2. 读论文,第十八天:EarBuddy: Enabling On-Face Interaction via Wireless Earbuds
  3. oracle 7 密码,【翻译自mos文章】重置Oracle Linux 7中root的口令
  4. ISME | 沈其荣团队韦中组-土壤生物障碍发生的根际微生物组诊断
  5. 模型质量控制管理2——提高精度解决模型非实体不封闭破面等问题
  6. Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev
  7. 新浪微博秀引用到jsp中显示空白
  8. FBE 加密手机修改密码最后点确定时,马上拔电池掉电出现开机进入recovery
  9. AUTOCAD学习笔记8:单相桥式整流滤波稳压电路的绘制
  10. 抖音企业认证有什么好处和坏处?需要认证吗?