悬浮球拖拽

这篇博客介绍了如何使用HTML、CSS和JavaScript实现一个悬浮球,并通过触屏事件监听实现拖拽功能。当悬浮球移动到屏幕边缘时,会自动调整位置。同时,点击悬浮球内的X标记可以隐藏悬浮球。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <!-- Smart App Banner -->
    <meta name="apple-itunes-app" content="app-id=APP_ID,affiliate-data=AFFILIATE_ID,app-argument=SOME_TEXT">
    <!-- 禁止自动探测并格式化手机号码 -->
    <meta name="format-detection" content="telephone=no">
    <!-- Add to Home Screen添加到主屏 -->
    <!-- 是否启用 WebApp 全屏模式 -->
    <meta name="apple-mobile-web-app-capable" content="yes">
    <!-- 设置状态栏的背景颜色,只有在 “apple-mobile-web-app-capable” content=”yes” 时生效 -->
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <!-- 添加到主屏后的标题 -->
    <meta name="apple-mobile-web-app-title" content="App Title">
    <title>悬浮球</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        /*#id{*/
            /*width: 50px;*/
            /*height: 50px;*/
            /*position: fixed;*/
            /*left: 0px;top: 300px;*/

            /*background: darkgrey;*/
        /*}*/
        /*#span{*/
            /*font-size: 18px;*/
            /*position: absolute;*/
        /*}*/



    </style>

</head>
<body>
<!--<div id="id" style="">-->
    <!--<img style="width: 35px;height: 35px;" src="d3e78caf201e0cf7c0b137b402817f02_1.jpg">-->
    <!--<span id="span">X</span>-->
<!--</div>-->
<script src="https://code.jquery.com/jquery-3.3.1.min.js "></script>
<script type="text/javascript">


    var box_div=document.createElement('div');

    box_div.style.cssText = " width: 50px;height: 50px;position: fixed; left: 0px;top: 300px;background: darkgrey;";

    box_div.setAttribute('id','id');

    var img=document.createElement('img');

    img.style.cssText='width: 35px;height: 35px;';

     // document.body.insertBefore(box_div);

    document.body.insertBefore(box_div,document.body.children[0]);

     img.setAttribute('src','d3e78caf201e0cf7c0b137b402817f02_1.jpg');

    box_div.appendChild(img);

    var spn=document.createElement('span');

    spn.setAttribute('id','span');

    spn.innerHTML='X';

    box_div.appendChild(spn);



    var _x_start,_y_start,_x_move,_y_move,_x_end,_y_end,left_start,top_start;
    //按下
    document.getElementById("id").addEventListener("touchstart",function(e)
    {
        _x_start=e.touches[0].pageX;//起始点击位置
        _y_start=e.touches[0].pageY;//起始点击位置
        left_start=$("#id").css("left");//元素左边距
        top_start=$("#id").css("top");//元素上边距
    });
    //移动
    document.getElementById("id").addEventListener("touchmove",function(e)
    {
        e.preventDefault();//取消事件的默认动作。
        _x_move=e.touches[0].pageX;//当前屏幕上所有触摸点的集合列表
        _y_move=e.touches[0].pageY;//当前屏幕上所有触摸点的集合列表
        //左边距=当前触摸点-鼠标起始点击位置+起始左边距
        $("#id").css("left",parseFloat(_x_move)-parseFloat(_x_start)+parseFloat(left_start)+"px");
        //上边距=当前触摸点-鼠标起始点击位置+起始上边距
        $("#id").css("top",parseFloat(_y_move)-parseFloat(_y_start)+parseFloat(top_start)+"px");
    });
    //松开
    document.getElementById("id").addEventListener("touchend",function(e)
    {

        var bodyW=$(window).width()/2;//屏幕宽的一半
        var bodyH=$(window).height();//屏幕高
        var _x_end=e.changedTouches[0].pageX;//松开位置
        var _y_end=e.changedTouches[0].pageY;//松开位置
        var divH= $("#id").height();//元素高
        var divW= $("#id").width();//元素宽
        //当最终位置在屏幕左半部分
        if(_x_end<bodyW){
            $("#id").css("left","0px");
        }else if(_x_end>=bodyW){//当最终位置在屏幕左半部分
            $("#id").css("left",$(window).width()-parseFloat(divW))
        }
        //当元素顶部在屏幕外时
        if(parseFloat($("#id").css("top"))<0){
            //置于顶部
            $("#id").css("top",0);//置于顶部
        }
        //当元素底部在屏幕外时
        if(bodyH-_y_end<parseFloat(divH)/2){
            //置于底部
            $("#id").css("top",bodyH-parseFloat(divH))
        }
    });
    $("img").click(function(){
        console.log('点击');
    });
    $('#span').click(function(){
        $('#id').css({
            display:'none'
        })
    })


</script>
</body>
</html>
### 回答1: Android中的WindowManager是Android系统中的一个关键类,它负责管理所有窗口的显示和布局。而悬浮球则是窗口中的一个小球,它可以随意拖动并悬浮在其他应用程序之上。 实现悬浮球的拖动可以通过以下步骤完成: 1. 创建一个悬浮球的View:首先需要创建一个自定义的View,用于显示悬浮球。这个View可以是一个小球的图片或者是一个自定义形状的View。 2. 添加悬浮球的权限:在AndroidManifest.xml文件中添加SYSTEM_ALERT_WINDOW权限,这是一项特殊权限,用于显示系统级别的悬浮窗口。 3. 创建悬浮球的WindowManager:通过WindowManager类的实例,可以获取到系统的WindowManager服务。 4. 将悬浮球的View添加到WindowManager中:使用WindowManager.LayoutParams参数来设置上述View的显示位置、大小、类型等属性,并通过WindowManager的addView方法将View添加到窗口中。 5. 监听悬浮球的触摸事件:为悬浮球的View设置触摸监听器,当用户按下悬浮球并移动手指时,通过更新悬浮球的LayoutParams参数的x和y属性来实现悬浮球的拖动操作。 6. 处理悬浮球的点击事件:为悬浮球的View设置点击监听器,当用户点击悬浮球时,可以执行相应的操作,如显示菜单、打开应用程序等。 7. 移除悬浮球的View:当不再需要显示悬浮球时,可以通过调用WindowManager的removeView方法将悬浮球的View从窗口中移除,并及时回收相关资源。 以上就是利用WindowManager实现Android悬浮球拖动的基本步骤。通过监听触摸事件和点击事件,可以实现悬浮球的拖动和响应用户操作的功能。同时,需要注意悬浮球的权限问题,以保证正确显示和操作悬浮球。 ### 回答2: Android WindowManager 悬浮球是一种常见的用户界面元素,常用于显示快捷方式、通知或其他常用功能。用户可以通过拖动悬浮球的方式来操作相关功能。 要实现悬浮球的拖动功能,首先需要创建一个悬浮球的视图,并将其添加到 WindowManager 中。可以通过创建一个继承自 View 的自定义悬浮球类来实现这一点。 在自定义悬浮球类中,需要重写 onTouchEvent() 方法以处理触摸事件。当用户按下悬浮球时,记录下手指按下的初始位置。当用户移动手指时,根据手指的移动距离来更新悬浮球的位置。可以使用 WindowManager.LayoutParams 的 x 和 y 属性来指定悬浮球的位置。 同时,还可以根据需要添加一些限制条件,如限制悬浮球的移动范围、限制悬浮球的吸附行为等。这些都可以通过对 MotionEvent 的处理来实现。 当用户松开手指时,悬浮球的拖动操作结束。此时,可以保存最后的位置信息以便下次使用。同时,还可以根据需要触发相应的功能操作,如打开一个快捷方式或显示一个通知等。 需要注意的是,要实现悬浮球的拖动功能,必须具有相应的权限。在 AndroidManifest.xml 文件中声明 SYSTEM_ALERT_WINDOW 权限,并在运行时请求该权限,以确保可以在其他应用程序上方显示悬浮球。 综上所述,通过自定义 View 类,重写 onTouchEvent() 方法,结合 WindowManager 的使用,可以实现 Android WindowManager 悬浮球的拖动功能。这样,用户就可以方便地通过拖动悬浮球来操作相关功能,并且可以根据实际需求对拖动行为进行定制。 ### 回答3: 在Android中,WindowManager是Android系统的一个重要组件,用于管理应用程序窗口的创建、显示和更新。悬浮球是一种常见的用户界面交互方式,它可以在屏幕上悬浮显示,并且可以通过拖动操作实现位置的改变。 实现悬浮球拖动的基本步骤如下: 1. 创建悬浮球视图:通过编程方式创建一个悬浮球视图,并设置其初始位置和样式。可以使用自定义的绘制工具或者使用现有的View类来实现悬浮球的外观。 2. 监听触摸事件:为悬浮球视图设置触摸事件的监听器,以便能够响应用户的触摸操作。可以通过重写onTouchEvent()方法来实现触摸事件的处理。 3. 处理触摸事件:在触摸事件的监听器中,根据不同的事件类型(如按下、移动、抬起),实现相应的逻辑。例如,当用户按下悬浮球时,记录下手指的初始位置;当用户移动手指时,根据手指的位置和初始位置计算悬浮球的新位置,并更新悬浮球的显示;当用户抬起手指时,完成悬浮球的拖动操作。 4. 更新悬浮球位置:在悬浮球拖动的过程中,需要不断更新悬浮球的位置。可以使用WindowManager的LayoutParams类来设置悬浮球的新位置,并通过WindowManager的updateViewLayout()方法来更新悬浮球的显示。 5. 处理边界情况:在处理悬浮球的拖动过程中,需要考虑到悬浮球是否超出屏幕边界的情况。可以通过判断悬浮球的位置,以及屏幕的大小来限制悬浮球的移动范围,避免悬浮球超出屏幕。 总之,通过使用WindowManager和触摸事件的监听器,可以实现Android中悬浮球的拖动功能。这个功能在许多应用中都很常见,例如一些工具类应用和游戏应用,可以增加用户的交互体验和便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值