自定义可自由移动的浮窗
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; } }); } }
相关文章推荐
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- Android-图片预览(自定义ImageView 封装(jar): 图片放大缩小,自由移动,双击放大,多点触控)
- android自定义view实现可自由放大缩小和移动的imageView
- 自定义可以按键控制自由移动的View
- Qt自定义类之自由移动的mainwindow
- Android——自定义View随手自由移动
- WindowManager实现悬浮窗口&可自由移动的悬浮窗口
- [Android]自定义移动网络接入点
- Android 自定义 按当前view的宽高进行矩形移动内容图
- MFC中自由使用自定义消息
- MFC中自由使用自定义消息
- 移动开发----Android模仿打字机效果的自定义View实现
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- 自定义View:点、图片随手指而移动的View
- Android中可自由移动悬浮窗口的Demo
- 应用自定义移动设备外观
- CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义)
- iOS table简单实现增加移动和删除功能与自定义cell的实现
- 在MDI方式下自由生成自定义的子窗口