解决方案 »

  1.   

    import java.util.List;import android.app.Activity;
    import android.app.ActivityManager;
    import android.app.ActivityManager.RunningTaskInfo;
    import android.content.ComponentName;
    import android.graphics.Color;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.Gravity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.view.WindowManager.LayoutParams;
    import android.widget.Button;public class MainActivity extends Activity { private WindowManager wm = null;
    Runnable runnable;
    private WindowManager.LayoutParams wmParams = null; private MyFloatView myFV = null;
    public Handler handler;
    String temp; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getTopActivity(this); // 获取启动按钮
    Button start = (Button) findViewById(R.id.button1);
    // 获取移除按钮
    Button remove = (Button) findViewById(R.id.button2);
    // 绑定监听
    start.setOnClickListener(new OnClickListener() { @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    createView();
    // Intent intent = new Intent(MainActivity.this, FxService.class);  
    //                //启动FxService
    //                startService(intent);  }
    }); remove.setOnClickListener(new OnClickListener() { @Override
    public void onClick(View v) {
    wm.removeView(myFV);
    // Intent intent = new Intent(MainActivity.this, FxService.class);  
    //                //终止FxService  
    //                stopService(intent);  
    }
    }); } void getTopActivity(Activity context) {
    handler = new Handler();
    runnable = new Runnable() { @Override
    public void run() {
    // TODO Auto-generated method stub
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<RunningTaskInfo> runningTaskInfos = manager
    .getRunningTasks(1);
    if (runningTaskInfos != null) {
    ComponentName cn = runningTaskInfos.get(0).topActivity;
    temp = "你当前打开程序的信息为:\n包名:" + cn.getPackageName() + "\n类名:"
    + cn.getClassName();
    }
    handler.postDelayed(this, 50);
    } };
    handler.postDelayed(runnable, 50);
    } private void createView() {
    myFV = new MyFloatView(getApplicationContext());
    myFV.setText(temp);
    myFV.setTextColor(Color.BLACK);
    // 获取WindowManager
    wm = (WindowManager) getApplicationContext().getSystemService("window");
    // 设置LayoutParams(全局变量)相关参数
    wmParams = ((MyApplication) getApplication()).getMywmParams(); /**
     * 以下都是WindowManager.LayoutParams的相关属性 具体用途可参考SDK文档
     */
    wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type
    wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 // 设置Window flag
    wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
    | LayoutParams.FLAG_NOT_FOCUSABLE;
    /*
     * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
     * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
     * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
     */ wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
    // 以屏幕左上角为原点,设置x、y初始值
    wmParams.x = 0;
    wmParams.y = 0; // 设置悬浮窗口长宽数据
    wmParams.width = 500;
    wmParams.height = 250; // 显示myFloatView图像
    wm.addView(myFV, wmParams); }
    @Override
    protected void onPause() {
    // TODO Auto-generated method stub
    getTopActivity(MainActivity.this);
    super.onPause();
    }

    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    handler.removeCallbacks(runnable);
    super.onDestroy();
    }
    }
      

  2.   

    import android.content.Context;
    import android.util.Log;
    import android.view.WindowManager;
    import android.widget.TextView;
    import android.view.MotionEvent;public class MyFloatView extends TextView {
    private float mTouchStartX;
    private float mTouchStartY;
    private float x;
    private float y; private WindowManager wm = (WindowManager) getContext()
    .getApplicationContext().getSystemService("window");
    // 此wmParams为获取的全局变量,用以保存悬浮窗口的属性
    private WindowManager.LayoutParams wmParams = ((MyApplication) getContext()
    .getApplicationContext()).getMywmParams(); public MyFloatView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    }

     @Override  
         public boolean onTouchEvent(MotionEvent event) {  
               
               
             //获取相对屏幕的坐标,即以屏幕左上角为原点        
             x = event.getRawX();     
             y = event.getRawY()-25;   //25是系统状态栏的高度  
             Log.i("currP", "currX"+x+"====currY"+y);  
             switch (event.getAction()) {  
                case MotionEvent.ACTION_DOWN:  
                    //获取相对View的坐标,即以此View左上角为原点  
                    mTouchStartX =  event.getX();    
                    mTouchStartY =  event.getY();  
                      
                    Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);  
                      
                    break;  
                case MotionEvent.ACTION_MOVE:                 
                    updateViewPosition();  
                    break;  
      
                case MotionEvent.ACTION_UP:  
                    updateViewPosition();  
                    mTouchStartX=mTouchStartY=0;  
                    break;  
                }  
                return true;  
            }  
           
         private void updateViewPosition(){  
            //更新浮动窗口位置参数  
            wmParams.x=(int)( x-mTouchStartX);  
            wmParams.y=(int) (y-mTouchStartY);  
            wm.updateViewLayout(this, wmParams);  
         }  }