可移动悬浮窗口实现

先直接上代码:(代码中有少量的注解,但都是实现功能的关键)

接口ViewManager中定义了addView、reMoveView、updateView方法,WindManager实现了ViewManager但是没有直接去实现这三个方法,间接的交给WindowManagerGlobal去实现addView、reMoveView、updateView方法。

package com.example.andyshangguan.test_windowmnanger;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Toast;

@SuppressLint("ServiceCast")
public class MainActivity extends Activity {

    private View windowView;
    private LayoutInflater inflater;
    private WindowManager.LayoutParams wL;
    private WindowManager windowManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
       // inflater = getLayoutInflater();
        inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        windowView = inflater.inflate(R.layout.layout_showwindow, null);
        //(ViewGroup)getWindow().getDecorView().findViewById(android.R.id.content));
        windowView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "windowView", Toast.LENGTH_SHORT).show();
            }
        });
        windowView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标
                float rawx = event.getRawX() - v.getMeasuredWidth() / 2;
                float rawy = event.getRawY() - v.getMeasuredHeight() / 2;
                switch (event.getAction()) {
                    case MotionEvent.ACTION_MOVE:
                        Log.e("info", " event.getX()====" + event.getRawX());
                        Log.e("info", " event.getY()====" + event.getRawY());
                        wL.x = (int) rawx;
                        wL.y = (int) rawy;
                        windowManager.updateViewLayout(v, wL);
                        break;

                    default:
                        break;
                }

                return false;
            }
        });
        wL = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,
                //TYPE_TOAST类型系统是不需要权限的。如果申明为TYPE_SYSTEM_XXX权限,在AndroidManifest.xml申明权限
//参考:http://www.jianshu.com/p/167fd5f47d5c?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
                LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_TOAST, 0, PixelFormat.TRANSPARENT);
        wL.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                | LayoutParams.FLAG_NOT_FOCUSABLE
                | LayoutParams.FLAG_SHOW_WHEN_LOCKED;
        wL.gravity = Gravity.LEFT | Gravity.TOP;
        wL.x = 100;
        wL.y = 300;
        windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    }
//在布局文件中直接使用的onClik方法
    public void showWindow(View v) {

        switch (v.getId()) {
            case R.id.showWindow:
                windowManager.addView(windowView, wL);

                break;

            default:
                break;
        }
    }


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值