【发布时间】:2014-06-27 00:31:03
【问题描述】:
我为我的Android 应用程序编写了Drag and drop 行为。到目前为止,它在我的HTC One 和我的Samsung S3 上运行良好。基本上,它只是将视图上的leftMargin 和topMargin 设置为移动。
当我在Xperia Arc S 上尝试时,我可以设置topMargin 并垂直移动视图而没有任何问题。但是一旦我尝试水平移动它(设置leftMargin),它就不起作用了。我什至不能以编程方式设置leftMargin。
我得到了一个非常简单的代码,但我不知道Xperia 上出了什么问题,以及为什么它在我得到的其他设备上也能正常工作。
params.topMargin = (int) event.getRawY() - view.getHeight();
params.leftMargin = (int) event.getRawX() - (view.getWidth() / 2);
// Set bounds
if (params.topMargin < 0) params.topMargin = 0;
if (params.topMargin + viewHeight * 3/2 > display.heightPixels) params.topMargin = display.heightPixels - viewHeight * 3/2;
if (params.leftMargin < 0) params.leftMargin = 0;
if (params.leftMargin + viewWidth > display.widthPixels) params.leftMargin = display.widthPixels - viewWidth;
view.setLayoutParams(params);
如果我显示leftMargin、display.widthPixels 和viewWidth 的值,我得到了一些看起来不错的东西。 (例如,leftMargin = 介于 -100 到 600 之间的任何值。目前widthPixels = 480 和 viewWidth = 316)。
Xperia 有问题还是我的代码有错误?
感谢您的宝贵帮助。
编辑:解决方案是(关于 Ved Prakash 帖子)
FrameLayout.LayoutParams paramsOld = (FrameLayout.LayoutParams) view.getLayoutParams();
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(paramsOld.width, paramsOld.height, Gravity.TOP);
params.topMargin = (int) event.getRawY() - view.getHeight();
params.leftMargin = (int) event.getRawX() - (view.getWidth() / 2);
// Set bounds
if (params.topMargin < 0) params.topMargin = 0;
if (params.topMargin + viewHeight * 3/2 > display.heightPixels) params.topMargin = display.heightPixels - viewHeight * 3/2;
if (params.leftMargin < 0) params.leftMargin = 0;
if (params.leftMargin + viewWidth > display.widthPixels) params.leftMargin = display.widthPixels - viewWidth;
view.setLayoutParams(params);
view.invalidate();
【问题讨论】:
-
是否在边距上填充选项?如果是的话,你可以试试。
-
什么意思?
view是一个简单的LinearLayout,wrap_content用于height和width。没有填充,我可以看到元素只占屏幕宽度的 25%。非常令人失望的是,它在我的 HTC 上完美运行,但在我的 Xperia 上却不行。 -
您是否通过调用 invalidate() 显式地使视图无效
标签: android layoutparams