/**
* 窗体管理者
*/
private WindowManager wm;
private View view;
long[] mHits = new long[2];//用来处理双击事件,同理可处理N击事件
/**
* 自定义土司
* @param context
* @param showMsg
*/
public void myToast(Context context,String showMsg) {
// 实例化窗体
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
view = View.inflate(context, R.layout.activity_demo_show, null);
TextView textview = (TextView) view.findViewById(R.id.tv_demo);
// 设置背景图片
view.setBackgroundResource(R.drawable.orange_bg);
textview.setText(showMsg);
// 窗体的参数设置
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
// 与窗体左上角对其
params.gravity = Gravity.TOP + Gravity.LEFT;
// 指定窗体距离左边100 上边100个像素
params.x = sp.getInt("lastx", 0);
params.y = sp.getInt("lasty", 0);
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
// android系统里面具有电话优先级的一种窗体类型,记得添加权限。
params.type = WindowManager.LayoutParams.TYPE_TOAST;//注意type的设置,不同安卓版本会有区别
wm.addView(view, params); //注意:这里只是添加,要有事件处理其remove(wm.removeView(view);),要不然会一直留在界面上
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
// 双击居中了。。。
//处理双击事件
}
}
});
// 给view对象设置一个触摸的监听器,使自定义Toast可以被拖动
view.setOnTouchListener(new OnTouchListener() {
// 定义手指的初始化位置
int startX;
int startY;
@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 newX = (int) event.getRawX();
int newY = (int) event.getRawY();
int dx = newX - startX;
int dy = newY - startY;
params.x += dx;
params.y += dy;
// 考虑边界问题
if (params.x < 0) {
params.x = 0;
}
if (params.y < 0) {
params.y = 0;
}
if (params.x > (wm.getDefaultDisplay().getWidth() - view
.getWidth())) {
params.x = (wm.getDefaultDisplay().getWidth() - view
.getWidth());
}
if (params.y > (wm.getDefaultDisplay().getHeight() - view
.getHeight())) {
params.y = (wm.getDefaultDisplay().getHeight() - view
.getHeight());
}
wm.updateViewLayout(view, params);
// 重新初始化手指的开始结束位置。
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:// 手指离开屏幕一瞬间
break;
}
return false;// 事件处理完毕了。不要让父控件 父布局响应触摸事件了。
}
});
}
//注解:调用窗体管理者需要获取权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Android开发中自定义Toast
最新推荐文章于 2024-10-31 10:32:58 发布