android PopupWindow如何拖动

zhang19_88 2012-12-11 11:22:11
有人做过类似的效果吗,我现在写的是可以拖动,但是第二次拖动时会从原始位置开始移动。
下面这代码实现的是,按住PopupWindow中的按钮,移动可实现整个PopupWindow的移动,初始化为Gravity.BOTTOM的位置,第一次因为该window在此位置,所以移动是正确的,但第二次开始,点击按钮开始移动的那一瞬间,就会突然跳到最开始的位置,然后才移动
	private void createPopup()
{
LayoutInflater flater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view = flater.inflate(R.layout.pop, null);

view.findViewById(R.id.button2).setOnTouchListener(new OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action = event.getAction();
switch(action)
{
case MotionEvent.ACTION_DOWN:
lastX = (int)event.getRawX();
lastY = (int)event.getRawY();
break;

case MotionEvent.ACTION_MOVE:
int dx = (int)event.getRawX() - lastX;
int dy = (int)event.getRawY() - lastY;
popup.update(dx, dy, -1, -1);

break;

}
return true;
}
});

popup = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popup.setFocusable(false);
popup.setTouchable(true);
popup.setOutsideTouchable(true);
//popup.showAsDropDown(findViewById(R.id.ding), 100, 100);
popup.showAtLocation(findViewById(R.id.button1), Gravity.BOTTOM, 0, 0);

//
popup.update();
}
...全文
678 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
箍心而行 2014-05-08
  • 打赏
  • 举报
回复
楼主求demo hx1992320@126.com
cml_bright 2014-05-07
  • 打赏
  • 举报
回复
不对,上面那个还有个问题,第二次以后就不正常了,代码应该再改一下
@Override
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch (action) {
				case MotionEvent.ACTION_DOWN:
					lastX = (int) event.getRawX();
					lastY = (int) event.getRawY();
					break;
				case MotionEvent.ACTION_UP:
					mScreenX = dx;
					mScreenY = dy;
					break;
				case MotionEvent.ACTION_MOVE:
					dx = (int) event.getRawX() - lastX + mScreenX;
					dy =  lastY - (int)event.getRawY() + mScreenY;
					pop_quality.update( dx,dy, -1, -1);
					break;
				}
				return true;
			}
其中mScreenX 和mScreenY 的初始值设为0,并 设置为全局变量
cml_bright 2014-05-07
  • 打赏
  • 举报
回复
下面这个正式解决了问题
public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch (action) {
				case MotionEvent.ACTION_DOWN:
					lastX = (int) event.getRawX();
					lastY = (int) event.getRawY();
					break;
				case MotionEvent.ACTION_UP:
					mScreenX += dx;
					mScreenY += dy;
					break;
				case MotionEvent.ACTION_MOVE:
					dx = (int) event.getRawX() - lastX + mScreenX;
					dy =  lastY - (int)event.getRawY() + mScreenY;
					System.out.println("X2 = "+ dx+", Y2 = "+ dy);
					pop_quality.update( dx,dy, -1, -1);
					break;
				}
				return true;
			}
cml_bright 2014-05-05
  • 打赏
  • 举报
回复
case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: dx = (int) event.getX() - lastX; dy = (int) event.getY() - lastY; mScreenX += dx; mScreenY += dy ; pop_main.update(mScreenX, mScreenY, -1, -1); break;
shiyuqi0205 2014-04-11
  • 打赏
  • 举报
回复
求分享 楼主大神 627802296@qq.com
祝三 2014-03-27
  • 打赏
  • 举报
回复
可不可以发我一份!937569563@qq.com
祝三 2014-03-27
  • 打赏
  • 举报
回复
楼主 拖动Demo可以分享下吗 谢谢.
小风Online 2014-03-13
  • 打赏
  • 举报
回复
楼主 拖动Demo可以分享下吗 谢谢.
yfunang 2013-12-06
  • 打赏
  • 举报
回复
楼主解决了 这个问题
zhang19_88 2013-08-16
  • 打赏
  • 举报
回复
自己实现了。。
韩小浪~~ 2013-07-17
  • 打赏
  • 举报
回复
PopupWindow拖动有demo吗,zzjhhb@163.com 谢了
第一滴泪 2013-07-17
  • 打赏
  • 举报
回复
这个问题如果调试的话应该很好解决。多半出现在popup.update这个方法上,你在ontouchend方法里重新设置下其位置setposition。
wlcw16 2012-12-11
  • 打赏
  • 举报
回复
试试把int dx int dy 变成成员变量。 现在是局部变量。
zhang19_88 2012-12-11
  • 打赏
  • 举报
回复
那两个值应该不关事吧,移动的时候它都会得到个最新的值啊 case MotionEvent.ACTION_MOVE: int dx = (int)event.getRawX() - lastX; int dy = (int)event.getRawY() - lastY; popup.update(dx, -dy, -1, -1); 这地方应该为负的,不然上下移动刚好颠倒,不知道为什么

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧