Android:如何不重叠动态视图? +视图的动态位置
Posted
技术标签:
【中文标题】Android:如何不重叠动态视图? +视图的动态位置【英文标题】:Android : How to not overlap dynamic views? + dynamic position of views 【发布时间】:2012-08-03 09:15:22 【问题描述】:我开发了一个在相机视图上显示标记的增强现实应用程序。 标记是通过获取数据库中的位置动态创建的视图。例如,标记代表建筑物,由名称和位置(纬度/经度)描述。
当应用程序启动时,我会获取手机的当前位置,并根据它们的位置和手机的方向(SensorManager)在屏幕上显示标记。
问题是当标记在同一方向时,它们会重叠。我希望标记是一对一排列的。
我尝试使用 RelativeLayout,但它并没有改变任何东西。
标记创建代码:
@Override
public void onResume()
super.onResume();
for(int j=0;j<markers.length;j++)
//System.out.println(prefMarkers[j]);
if(markers[j] == null)
RelativeLayout.LayoutParams rParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
markers = new DataList(); // My list of markers
for(int i=0; i<markers.size();i++)
markers[i].setOnClickListener(clickListener);
//addContentView(markers[j].get(i), params);
relative.addView(markers[j].get(i), rParams);
位置改变时的代码(标记移动):
public final static void moveSpot(Context c, View tv, GeoPoint p,
float azimut, Location me, int screenWidth, float roll,
int screenHeight, float pitch)
int angle = // Calculation for the position of the markers
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = -angle * screenWidth / 90;
lp.addRule(RelativeLayout.ABOVE);
tv.setLayoutParams(lp);
public SensorEventListener createListener()
return new SensorEventListener()
public void onAccuracyChanged(Sensor _sensor, int _accuracy)
public void onSensorChanged(SensorEvent evt)
if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION && markers != null)
for(int j=0;j<markers.length;j++)
moveSpot(context, markers[i], markers[i]
.getGeoPoint(), azimut, myLoc,
mScreenWidth, roll, mScreenHeight, pitch);
;
我认为我没有采取正确的方法,所以我该如何防止标记重叠? 如果您需要精确,请询问,我会尽量精确。
对不起我的英语不好:/
编辑:感谢 Martin Revert 的回复,我解决了部分问题。现在我没有重叠的问题,而是位置的问题。
这是我现在的应用程序的屏幕截图:
http://hpics.li/f7c402b
在这张图片上,我们可以看到无论如何都没有重叠的问题。 我想做的是在这个截图的重拍中:
http://hpics.li/25a059d
我希望这次我清楚了:x
【问题讨论】:
【参考方案1】:您需要为您在 ViewGroup 上创建的每个 View 分配一个 ID。
如果每个标记都是一个视图,请使用类似:
yourview[j].setId(j);
在将 addRule() 应用到“lp”布局之前执行此操作。
编辑:
您也可以考虑参考每个视图位置做这样的事情:
lp.addRule(RelativeLayout.ABOVE, yourview[j-1]);
【讨论】:
谢谢,我做到了,结果好多了,但我希望只显示一个重叠的视图,因为一些标记会越过屏幕:/但这是一个很好的进展,现在标记不重叠:) 很高兴它有帮助,请接受并检查响应是否有效,以便其他人将来可以重复使用它。谢谢! 对不起,我编辑了我的答案,它有助于但没有解决问题:/ 所以你需要重新表述你的问题。你写了“问题是当标记在同一个方向时,它们是重叠的。”并且解决了这个问题,为每个视图设置一个 id 并使用适当的常量来定位视图(BELOW、ABOVE 等)。那么,为什么响应无效?你能详细说明你的问题吗? 在我的回复中添加了一些信息。以上是关于Android:如何不重叠动态视图? +视图的动态位置的主要内容,如果未能解决你的问题,请参考以下文章
如何停止 Xamarin Android StackView 元素中的项目重叠?
如何使用“自动调整大小”避免 Android 中的小部件重叠。
Java/Android:如何在不切断边缘视图的情况下显示一系列图像视图?