本文共 3322 字,大约阅读时间需要 11 分钟。
点击事件是一系列动作的组合;
private View view; private WindowManager wm;
//自定义toast土司 private void toast(String address) { wm = (WindowManager) getSystemService(WINDOW_SERVICE); //用代码创建的view// view = new TextView(getApplicationContext());// view.setText(address);// view.setTextSize(22);// view.setTextColor(Color.RED);//用xml创建的view final View view = View.inflate(this, R.layout.addressshowbackground, null); TextView tv = view.findViewById(R.id.tv_addressback); //设置触摸事件监听 view.setOnTouchListener(new View.OnTouchListener() { private int startY; private int startX; @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction();//获取当前事件的类型 switch (action) { case MotionEvent.ACTION_DOWN://按下 //获取开始位置 startX = (int) event.getX(); startY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE://移动 //获取结束的位置 int endX = (int) event.getX(); int endY = (int) event.getY(); //手指的偏移量 int dx = endX - startX; int dy = endY - startY; params.x+=dx; params.y+=dy; // 考到边界问题 if(params.x<0){ params.x=0; }else if(params.y<0){ params.y=0; }else if(params.x>(wm.getDefaultDisplay().getWidth()-view.getWidth())){params.x=wm.getDefaultDisplay().getWidth()-view.getWidth(); }else if(params.y>(wm.getDefaultDisplay().getHeight()-view.getHeight()){ params.y=wm.getDefaultDisplay().getHeight()-view.getHeight(); } wm.updateViewLayout(view,params);//更新布局 //再次显示到imagev上, //更新一下开始的坐标 startX = endX; startY = endY; break; case MotionEvent.ACTION_UP://抬起//保存endX和endY break; case MotionEvent.ACTION_CANCEL://取消 break; } return true;//监听器处理完事件了,不要让父控件或父布局相应事件 } }); view.setBackgroundResource(R.drawable.ic_launcher_background);//设置背景 tv.setText(address); //设置窗体的参数 params = new WindowManager.LayoutParams(); params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.gravity= Gravity.TOP+Gravity.LEFT;//土司的位置在左上 params.x=100; params.y=100; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT;// params.type = WindowManager.LayoutParams.TYPE_TOAST; params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;//具有电话优先级的窗体,如果要能获的手势使劲按,就要用这个,还要添加系统的权限 wm.addView(view, params); }
wm.removeView(view);//移除窗体上的view
转载地址:http://xtmgi.baihongyu.com/