您的位置:首页 > 其它

自定义可自由移动的浮窗

2016-10-25 12:19 183 查看
思想:来源于Toast,Toast是一个可以附在任何应用之上的View

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);

LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);

result.mNextView = v;
result.mDuration = duration;

return result;
}


public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}

INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;//TN的构造方法中创建了ToastView,并将其加入到WindowManager中
tn.mNextView = mNextView;

try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}


自定义可自由移动的浮窗

/**
* 自定义归属地浮窗 需要权限android.permission.SYSTEM_ALERT_WINDOW
*/
private void showToast(String text) {
mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);

// 获取屏幕宽高
winWidth = mWM.getDefaultDisplay().getWidth();
winHeight = mWM.getDefaultDisplay().getHeight();

params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PHONE;// 电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
params.gravity = Gravity.LEFT + Gravity.TOP;// 将重心位置设置为左上方, 也就是(0,0)从左上方开始,而不是默认的重心位置
params.setTitle("Toast");

//int lastX = mPref.getInt("lastX", 0);
//int lastY = mPref.getInt("lastY", 0);

// 设置浮窗的位置, 基于左上方的偏移量
params.x = lastX;
params.y = lastY;

// view = new TextView(this);
view = View.inflate(this, R.layout.toast_address, null);

int[] bgs = new int[] { R.drawable.call_locate_white,
R.drawable.call_locate_orange, R.drawable.call_locate_blue,
R.drawable.call_locate_gray, R.drawable.call_locate_green };
int style = mPref.getInt("address_style", 0);

view.setBackgroundResource(bgs[style]);// 根据存储的样式更新背景

TextView tvText = (TextView) view.findViewById(R.id.tv_number);
tvText.setText(text);

mWM.addView(view, params);// 将view添加在屏幕上(Window)

view.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 初始化起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) event.getRawX();
int endY = (int) event.getRawY();

// 计算移动偏移量
int dx = endX - startX;
int dy = endY - startY;

// 更新浮窗位置
params.x += dx;
params.y += dy;

// 防止坐标偏离屏幕
if (params.x < 0) {
params.x = 0;
}

if (params.y < 0) {
params.y = 0;
}

// 防止坐标偏离屏幕
if (params.x > winWidth - view.getWidth()) {
params.x = winWidth - view.getWidth();
}

if (params.y > winHeight - view.getHeight()) {
params.y = winHeight - view.getHeight();
}

// System.out.println("x:" + params.x + ";y:" + params.y);

mWM.updateViewLayout(view, params);

// 重新初始化起点坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
// 记录坐标点
Editor edit = mPref.edit();
edit.putInt("lastX", params.x);
edit.putInt("lastY", params.y);
edit.commit();
break;

default:
break;
}
return true;
}
});
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  浮窗