android随笔12——toast响应触摸事件以及移动
2015-12-26 16:11
417 查看
* 窗体管理者,显示view 时,需要的布局参数 WindowManager.LayoutParams params = new WindowManager.LayoutParams(); private View toastView; private void showAddress(String incomingNumber) { String address = QueryAddressUtils.queryAddress(ctx, incomingNumber); // Toast.makeText(ctx, address, 1).show(); // inflate 方法将布局文件转换为view 对象,返回的对象,就是布局文件的根节点 toastView = View.inflate(ctx, R.layout.toast_show_address, null); TextView textView = (TextView) toastView.findViewById(R.id.tv_address); textView.setText(address); // 设置选择的样式 int index = sp.getInt(MyConstace.key_select_style, 0); toastView.setBackgroundResource(imageIds[index]); 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; // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE // 注掉此行,否则不能响应触摸事件 params.format = PixelFormat.TRANSLUCENT; // params.windowAnimations = com.android.internal.R.style.Animation_Toast; // 声明窗体的动画效果 // params.type 定义当前窗体的类型 TYPE_TOAST 类型的窗体,天生不能响应触摸事件 params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; // 修改为TYPE_PRIORITY_PHONE高优先级的窗体类型 //注意添加权限 SYSTEM_ALERT_WINDOW 系统警告窗体 params.setTitle("Itcast"); //设置标题 随意设置 ------------------------移动-------------------------- // params.gravity = Gravity.CENTER; // 默认是居中对齐,当 x,y 坐标都为0时,toastView显示在屏幕的中心 params.gravity = Gravity.LEFT+Gravity.TOP; // 改为左上对齐 // 读取设置,初始化位置 params.x = sp.getInt("params_x", 0); params.y = sp.getInt("params_y", 0); // 将view 添加至屏幕 wm.addView(toastView, params); // 给 toastView 设置触事件 toastView.setOnTouchListener(new View.OnTouchListener() { private int downX; private int downY; * 上一个触事件中的坐标 private int lastX; private int lastY; * 当触摸 toastView 时,调用此方法 * 如果 我们处理了事件,必须返回 true public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { // 获得当前事件的动作类型 case MotionEvent.ACTION_DOWN: //一:down 事件时,记录下触摸事件的X,Y坐标,downX,downY lastX= downX = (int) event.getRawX(); // 获得触摸点,相对于屏幕左上角的X坐标 lastY = downY = (int) event.getRawY();// 获得触摸点,相对于屏幕左上角的Y坐标 break; case MotionEvent.ACTION_MOVE: // 二:move事件时,获得move事件的xy坐标,moveX,moveY int moveX = (int) event.getRawX(); int moveY = (int) event.getRawY(); // 三:获得二个相邻事件之间的距离,而不是应该是move和down事件之间的距离,改变view在屏幕上的位置, int disX = moveX -lastX; int disY = moveY -lastY; params.x+=disX; params.y+=disY; wm.updateViewLayout(toastView, params); // 使用新的布局参数,更新view,在屏幕上的位置 // 四: 对上一个事件的XY坐标,进行重新赋值,方便下一次运算 lastX = moveX; lastY = moveY; break; case MotionEvent.ACTION_UP: //松手时,记录当前的位置 sp.edit().putInt("params_x", params.x).commit(); sp.edit().putInt("params_y", params.y).commit(); break; } return true; } }); }
相关文章推荐
- android随笔13——自定义属性
- Android 代码设置来电铃声
- Android Context完全解析,你所不知道的Context的各种细节
- android inflater 用法
- Android开启多进程
- android system.exit(0)后会重启
- Android编程开发实现带进度条和百分比的多线程下载
- 如何在android studio中配置lib
- Android使用SharedPreferences保存数组
- Android 正确修改项目包名而不报错的方法...
- Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
- Android greenDao 使用教程(一)源码编译与使用
- android:windowSoftInputMode属性详解
- 【风马一族_Android】android的新发现
- 学习笔记1: Activity 生命周期
- Android之获取手机上已安装的所有的应用程序的信息,并判断是否安装了某应用程序(系统程序或非系统应用程序判断)
- android——fragment长时间home或者锁屏java.lang.IllegalArgumentException:No view found for id for....
- android——拍照,相册图片剪切其实就这么简单
- android——生成或者下载的图片在相册中找不到
- android——fragment详解