我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

Android中怎么实现一个可移动的悬浮窗

这期内容当中小编将会给大家带来有关Android中怎么实现一个可移动的悬浮窗,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联是一家集网站建设,灌阳企业网站建设,灌阳品牌网站建设,网站定制,灌阳网站建设报价,网络营销,网络优化,灌阳网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

首先我们先建一个windowmangerdemo的项目

在activity_main里面增加一个button的按钮

Android中怎么实现一个可移动的悬浮窗

然后在布局Layout里面增加window_small.xml和window_big.xml两个布局文件,用于点击小窗口后展开大窗口

window_small.xml

Android中怎么实现一个可移动的悬浮窗

我们在线性布局管理嚣中直接加上一个相对布局管理嚣.然后设上背景图片即可


FloatWindowSmallView

我们的floatWindowSmallView继承自LinearLayout

重写onTouchEvent事件,我们用于可以随时点击移动和展开我们的悬浮框

    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 手指按下时记录必要数据,纵坐标的值都需要减去状态栏高度
                xInView = event.getX();
                yInView = event.getY();
                xDownInScreen = event.getRawX();
                yDownInScreen = event.getRawY() - getStatusBarHeight();
                xInScreen = event.getRawX();
                yInScreen = event.getRawY() - getStatusBarHeight();
                break;
            case MotionEvent.ACTION_MOVE:
                xInScreen = event.getRawX();
                yInScreen = event.getRawY() - getStatusBarHeight();
                // 手指移动的时候更新小悬浮窗的位置
                updateViewPosition();
                break;
            case MotionEvent.ACTION_UP:
                // 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。
                if (xDownInScreen == xInScreen && yDownInScreen == yInScreen) {
                    openBigWindow();
                }
                break;
            default:
                break;
        }
        return true;
    }


window_big.xml

Android中怎么实现一个可移动的悬浮窗

我们设了三个垂直的ImageButton,代表点击小窗体后展开的大的窗体

Android中怎么实现一个可移动的悬浮窗


FloatWindowBigView

代码比较简单,直接写对应的事件即可

public class FloatWindowBigView extends LinearLayout {

    public static int viewWidth;
    public static int viewHeight;

    public FloatWindowBigView(final Context context) {
        super(context);

        LayoutInflater.from(context).inflate(R.layout.window_big, this);
        View view = findViewById(R.id.big_window_layout);
//        viewWidth = view.getLayoutParams().width;
//        viewHeight = view.getLayoutParams().height;
        viewWidth= 120;
        viewHeight = 370;
        ImageButton imgbig = (ImageButton) findViewById(R.id.imgbig);
        ImageButton imgcamera = findViewById(R.id.imgcamera);
        ImageButton imgvoice = findViewById(R.id.imgvoice);

        imgcamera.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "点击了照相机", Toast.LENGTH_SHORT).show();
            }
        });

        imgvoice.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "点击了语音识别", Toast.LENGTH_SHORT).show();
            }
        });

        imgbig.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 点击返回的时候,移除大悬浮窗,创建小悬浮窗
                MyWindowManager.removeBigWindow(context);
                MyWindowManager.createSmallWindow(context);
            }
        });
    }
}


MyWindowManager

这个类是我们管理大小悬浮框的事件类,包括关闭小悬浮窗,展开大悬浮窗等

Android中怎么实现一个可移动的悬浮窗

我们把大小悬浮穿的参数分别对应不同的LayoutParams,都在这里处理


FloatWindow

做一个floatWindow继承自Service

通过Handler和Time控件来刷新悬浮窗是否一直存在

/**
* 判断当前界面是否是扫码界面
*/
private boolean isForeground(String[] classNames) {
   if (classNames.length <= 0) {
       return false;
   }

   ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
   //判断当前进程
   List appProcesses = am
           .getRunningAppProcesses();
   for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
       if (appProcess.processName.equals(getPackageName())) {
           //判断程序是否处于前台,如果是后台则不显示悬浮框
           if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
               Log.i(getPackageName(), "处于后台"
                       + appProcess.processName);
               return false;
           }
       }
   }

   //判断顶层Activity
   List list = am.getRunningTasks(1);
   if (list != null && list.size() > 0) {
       ComponentName cpn = list.get(0).topActivity;
       for (String className : classNames) {
           if (className.equals(cpn.getClassName())) {
               return true;
           }
       }
   }
   return false;
}
class RefreshTask extends TimerTask {

   @Override
   public void run() {
       // 当前界面是要显示的界面,且没有悬浮窗显示,则创建悬浮窗。
       if (isForeground(activityname) && !MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.createSmallWindow(getApplicationContext());
               }
           });
       }
       // 当前界面要显示的界面,且有悬浮窗显示,则移除悬浮窗。
       else if (!isForeground(activityname) && MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.removeSmallWindow(getApplicationContext());
                   MyWindowManager.removeBigWindow(getApplicationContext());
               }
           });
       }
       // 当前界面是要显示的界面,且有悬浮窗显示,则更新内存数据。
       else if (isForeground(activityname) && MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.updateUsedPercent(getApplicationContext());
               }
           });
       }
   }

}

上述就是小编为大家分享的Android中怎么实现一个可移动的悬浮窗了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


分享文章:Android中怎么实现一个可移动的悬浮窗
文章路径:http://mswzjz.cn/article/pidosg.html

其他资讯