1

カメラビューにマーカーを表示する拡張現実アプリケーションを開発しています。マーカーは、データベース内の位置を取得することによって動的に作成されたビューです。マーカーは、たとえば、名前と位置(緯度/経度)で記述された建物を表します。

アプリケーションを起動すると、電話の現在の場所を取得し、その場所と電話の向き(SensorManager)に応じてマーカーを画面に表示します。

問題は、マーカーが同じ方向にある場合、それらが重なることです。マーカーを1つ重ねて配置してほしい。

私は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

4

1 に答える 1

1

ViewGroupで作成するすべてのビューにIDを割り当てる必要があります。

すべてのマーカーがビューである場合は、次のようなものを使用します。

yourview[j].setId(j);

addRule()を「lp」レイアウトに適用する前にこれを行ってください。

編集:

また、次のようなことを行うすべてのビュー位置を参照することを検討することもできます。

lp.addRule(RelativeLayout.ABOVE, yourview[j-1]);
于 2012-08-03T09:55:03.793 に答える