我开发了一个增强现实应用程序,它在摄像机视图上显示标记。 标记是通过获取数据库中的位置动态创建的视图。标记表示建筑物,例如,由名称和位置(纬度/经度)描述。
启动应用程序后,我会获取手机的当前位置,并根据手机的位置和方向(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);
}
};
}
我认为我没有采取正确的方法,所以如何防止标记重叠? 如果你需要精确,请问我会尽可能准确。
抱歉我的英语不好:/
这是我的应用程序的屏幕截图:
在这张照片上,我们可以看到无论如何都没有重叠的问题。 我想要做的就是重新制作屏幕截图:
我希望这次我很清楚:x
答案 0 :(得分:1)
您需要为在ViewGroup上创建的每个视图分配一个ID。
如果每个标记都是View,请使用以下内容:
yourview[j].setId(j);
在将addRule()应用到“lp”布局之前,请执行此操作。
编辑:
您也可以考虑参考每个观点位置做这样的事情:
lp.addRule(RelativeLayout.ABOVE, yourview[j-1]);