当前位置: 首页 > wzjs >正文

阿里云网站地图是怎么做的新开传奇网站大全

阿里云网站地图是怎么做的,新开传奇网站大全,北京首钢建设有限公司网站,校车网站建设文章目录 一、基础实现方案1. 使用 WindowManager 实现全局悬浮窗2. 布局文件 (res/layout/floating_button.xml)3. 圆形背景 (res/drawable/circle_background.xml)4. 启动服务 二、权限处理1. AndroidManifest.xml 中添加权限2. 检查并请求权限 三、高级功能扩展1. 添加动画效…

文章目录

    • 一、基础实现方案
      • 1. 使用 WindowManager 实现全局悬浮窗
      • 2. 布局文件 (res/layout/floating_button.xml)
      • 3. 圆形背景 (res/drawable/circle_background.xml)
      • 4. 启动服务
    • 二、权限处理
      • 1. AndroidManifest.xml 中添加权限
      • 2. 检查并请求权限
    • 三、高级功能扩展
      • 1. 添加动画效果
      • 2. 自动吸附边缘
      • 3. 显示/隐藏动画
    • 四、优化建议
    • 五、替代方案
      • 1. 使用 CoordinatorLayout + FloatingActionButton
      • 2. 使用第三方库
    • 六、常见问题解决

在这里插入图片描述

在 Android 应用中实现全局悬浮按钮是一个常见的需求,可以用于快速访问重要功能或返回顶部等操作。下面我将详细介绍如何实现一个自定义的全局悬浮按钮。

一、基础实现方案

1. 使用 WindowManager 实现全局悬浮窗

这是最灵活的实现方式,可以在任何界面显示悬浮按钮:

public class FloatingButtonService extends Service {private WindowManager windowManager;private View floatingButton;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 创建悬浮按钮视图floatingButton = LayoutInflater.from(this).inflate(R.layout.floating_button, null);// 设置按钮点击事件floatingButton.findViewById(R.id.float_button).setOnClickListener(v -> {// 处理点击事件Toast.makeText(this, "悬浮按钮被点击", Toast.LENGTH_SHORT).show();});// 设置窗口参数WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :WindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);// 设置初始位置params.gravity = Gravity.TOP | Gravity.START;params.x = 0;params.y = 100;// 获取WindowManager并添加视图windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);windowManager.addView(floatingButton, params);// 添加拖拽功能addDragFeature();}private void addDragFeature() {floatingButton.setOnTouchListener(new View.OnTouchListener() {private int initialX;private int initialY;private float initialTouchX;private float initialTouchY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:initialX = params.x;initialY = params.y;initialTouchX = event.getRawX();initialTouchY = event.getRawY();return true;case MotionEvent.ACTION_MOVE:params.x = initialX + (int) (event.getRawX() - initialTouchX);params.y = initialY + (int) (event.getRawY() - initialTouchY);windowManager.updateViewLayout(floatingButton, params);return true;}return false;}});}@Overridepublic void onDestroy() {super.onDestroy();if (floatingButton != null) {windowManager.removeView(floatingButton);}}
}

2. 布局文件 (res/layout/floating_button.xml)

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageButtonandroid:id="@+id/float_button"android:layout_width="56dp"android:layout_height="56dp"android:background="@drawable/circle_background"android:src="@drawable/ic_float_button"android:elevation="8dp"android:layout_margin="16dp" /></FrameLayout>

3. 圆形背景 (res/drawable/circle_background.xml)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="@color/colorPrimary" />
</shape>

4. 启动服务

// 在需要显示悬浮按钮的地方启动服务
startService(new Intent(context, FloatingButtonService.class));// 停止服务
stopService(new Intent(context, FloatingButtonService.class));

二、权限处理

1. AndroidManifest.xml 中添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2. 检查并请求权限

// 检查悬浮窗权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, OVERLAY_PERMISSION_REQ);} else {// 已经有权限,启动服务startService(new Intent(this, FloatingButtonService.class));}
} else {// 6.0以下直接启动startService(new Intent(this, FloatingButtonService.class));
}

三、高级功能扩展

1. 添加动画效果

// 在按钮点击时添加动画
floatingButton.setOnClickListener(v -> {// 缩放动画ObjectAnimator scaleX = ObjectAnimator.ofFloat(v, "scaleX", 1f, 0.8f, 1f);ObjectAnimator scaleY = ObjectAnimator.ofFloat(v, "scaleY", 1f, 0.8f, 1f);AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(scaleX, scaleY);animatorSet.setDuration(200);animatorSet.start();// 执行点击操作performButtonAction();
});

2. 自动吸附边缘

private void autoAttachToEdge() {int screenWidth = getResources().getDisplayMetrics().widthPixels;int buttonWidth = floatingButton.getWidth();if (params.x < screenWidth / 2 - buttonWidth / 2) {// 吸附到左边params.x = 0;} else {// 吸附到右边params.x = screenWidth - buttonWidth;}windowManager.updateViewLayout(floatingButton, params);
}

3. 显示/隐藏动画

public void hideButton() {floatingButton.animate().translationY(floatingButton.getHeight()).setDuration(300).start();
}public void showButton() {floatingButton.animate().translationY(0).setDuration(300).start();
}

四、优化建议

  1. 性能优化

    • 使用轻量级的视图层级
    • 避免频繁调用 updateViewLayout
    • 使用硬件加速
  2. 内存管理

    • 在不需要时及时移除悬浮窗
    • 在低内存时自动隐藏
  3. 用户体验

    • 添加适当的触摸反馈
    • 考虑屏幕旋转时的位置调整
    • 提供设置选项让用户自定义位置和行为
  4. 兼容性处理

    • 处理不同 Android 版本的权限差异
    • 适配各种屏幕尺寸和密度
    • 考虑全面屏和刘海屏的适配

五、替代方案

1. 使用 CoordinatorLayout + FloatingActionButton

如果只需要在应用内显示悬浮按钮,可以使用 Material Design 组件:

<androidx.coordinatorlayout.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><!-- 其他内容 --><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="16dp"android:src="@drawable/ic_add" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

2. 使用第三方库

一些流行的悬浮按钮库:

  • FloatingView
  • DraggablePanel
  • FloatWindow

六、常见问题解决

  1. 权限问题

    • 确保已正确请求 SYSTEM_ALERT_WINDOW 权限
    • 在 Android 6.0+ 上需要动态请求权限
    • 某些厂商 ROM 可能需要额外的白名单设置
  2. 位置不正确

    • 检查 WindowManager.LayoutParams 的 gravity 设置
    • 考虑状态栏和导航栏的高度
    • 在屏幕旋转时更新位置
  3. 点击穿透

    • 设置 FLAG_NOT_FOCUSABLE 可能导致点击事件穿透
    • 可以通过在 onTouch 中返回 true 来拦截事件
  4. 内存泄漏

    • 确保在服务销毁时移除视图
    • 避免在视图中持有 Activity 引用

文章转载自:

http://ZWia89xq.rbkdg.cn
http://lMPZ8EPF.rbkdg.cn
http://ZZPch4eR.rbkdg.cn
http://HGZjs5eV.rbkdg.cn
http://qFHHXYfq.rbkdg.cn
http://dF5h5Xyd.rbkdg.cn
http://c7Gk8qds.rbkdg.cn
http://CKN6zeIS.rbkdg.cn
http://tZBFVzkx.rbkdg.cn
http://krB9iRx8.rbkdg.cn
http://M5Ae9OSM.rbkdg.cn
http://DR3VZgXb.rbkdg.cn
http://hxAlDF5W.rbkdg.cn
http://BGRMFTup.rbkdg.cn
http://HqEu4LI7.rbkdg.cn
http://mYgZ7GhO.rbkdg.cn
http://JFBRHq70.rbkdg.cn
http://FdTjNQWB.rbkdg.cn
http://IUaBNLR6.rbkdg.cn
http://wvZtpyZ2.rbkdg.cn
http://jeZBuhE3.rbkdg.cn
http://7zxVOArT.rbkdg.cn
http://7HDuj0HO.rbkdg.cn
http://O9UJkWFi.rbkdg.cn
http://aHjrpAkH.rbkdg.cn
http://dU9Cpxbk.rbkdg.cn
http://oV1iSWSN.rbkdg.cn
http://bFs30ygm.rbkdg.cn
http://jyEGhFtH.rbkdg.cn
http://YkBnMG9z.rbkdg.cn
http://www.dtcms.com/wzjs/679089.html

相关文章:

  • 重庆网站建设快忻科技前端静态网站开发
  • 优化网站公司哪家口碑好大规模301让网站快速排名
  • 网站开发的课程设置成都哪家网站建设
  • 电商网站开发用什么语言表达网站设计网站建设毕业文稿
  • 显示网站目录拼车网站的建设雨实现
  • 摄影网站排行榜前十名望城区建设局网站
  • 1.网站开发的详细流程自由贸易试验区网站建设方案
  • 什么叫宣传类网站有什么免费的网站
  • 专业格泰网站建设外文网站建设完成
  • 生物技术网站开发网站建设需要具备哪些知识
  • 潍坊做网站软件最新招总代理项目
  • 能发朋友圈的网站建设语婚纱摄影行业网站
  • 网站设计岗位做哪些事情企业展示型电商网站模板
  • 响应式h5网站多少钱重庆网站建设费用
  • 龙华公司做网站wordpress 替代
  • 哈尔滨网站制作软件做网站好一点的软件
  • ui网站界面设计模板公众号购物做网站还是小程序
  • cnzz统计代码如何添加到网站上去大型网站建设兴田德润实惠
  • 重庆模板建站哪家好济南做网站哪家便宜
  • 手机网站建设 新闻网站开发新动力
  • 个人电脑做网站服务器网站广东新闻联播2011
  • 沈阳凯鸿网站建设app外包接活
  • 用织梦做网站后面可以改吗网络平台维护
  • 学校网站模板 html网站设计和管理容易吗
  • 做虾皮网站赚钱吗广州建设厅网站首页
  • 昆明网站营销全国集团网站建设
  • 做研学的网站h5手机网站开发demo
  • php做商城网站怎么做好firework做网站教程
  • 网站设计素材网站大全网站地址结构
  • 做网站图片存储用什么格式建设工程施工合同管理论文