解决方案 »
- android sdk 安装
- 关于android线程问题
- 急!!!pisnner获取的对象如何传递到天气预报的url地址去?
- 怎样调用系统自带的那个9宫格解锁程序,或者直接从源码中摘出来
- 设置listview中记录的背景色,在线等
- super.setResult(RESULT_OK, intent);如果intent数据太多,界面会黑屏反映很慢,有什么其他解决方案么?
- 高手进来帮帮忙,循环播放mp3停顿一下的问题
- 一个path框起了一个不规则的多边形,有没有办法判断一个点是否在这个多边形内?
- 请教一个在APP里监听网络状态变化的有意思的问题
- 【求助】HelloCharts柱状图怎么设置柱子宽度
- 安卓中Activity Lifecycle问题,求教大神
- 请问 判断是否联网和 是否有可用网络 这两个方法作用是不是一样的
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();
}
}
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);
} }