Android增强现实专业版AR 9:当显示太多标记时,活动会恢复

时间:2014-06-06 14:36:39

标签: android augmented-reality

我正在使用这个非常有用的教程(https://github.com/RaghavSood/ProAndroidAugmentedReality)来开发自定义AR应用。 它工作得很好,但是当我显示从文件夹中提取的标记时(有时),应用程序被阻止并从之前的活动重新启动。 我想这是因为大量的标记位于屏幕的同一点。 事实上,当我降低半径,然后显示更少数量的标记时,活动继续工作。 此外,我试图修改函数" getTextWidth()"正如网上许多人所说的那样。 我不知道如何减少在屏幕的同一点上绘制的标记的数量(因此不依赖于减小半径)。你能给我一些建议吗?感谢很多!!!!!

我向您展示了LocalDataSource.java已修改:

package com.example.pointofinterests;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

import com.example.pointofinterests.R;
import com.example.pointofinterests.IconMarker;
import com.example.pointofinterests.Marker;

/**
* This class should be used as a example local data source. It is an example of
* how to add data programatically. You can add data either programatically,
* SQLite or through any other source.
* 
* @author Justin Wetherell <phishman3579@gmail.com>
*/
public class LocalDataSource extends DataSource {

    private List<Marker> cachedMarkers = new ArrayList<Marker>();
    private static Bitmap icon = null;

    public LocalDataSource(Resources res) {
        if (res == null) throw new NullPointerException();
            createIcon(res);
    }

    protected void createIcon(Resources res) {
       if (res == null) throw new NullPointerException();
           icon = BitmapFactory.decodeResource(res, R.drawable.icon);
    }

    public List<Marker> getMarkers() {
        try{
        String TestoIDPercorsi = readFileAsString("/sdcard/Epulia/IDPercorsi.txt");
        if(TestoIDPercorsi==""){
           // DOING NOTHING
        }else {
            String[] IDPercorso = TestoIDPercorsi.split("#");
            for(int l=0; l<IDPercorso.length-1; l++){
                String TestoPercorso = readFileAsString("/sdcard/Epulia/Percorso" +          IDPercorso[l] + ".txt");
                if (TestoPercorso.equals("")){
                }else {
                    ArrayList<String> IDSTEPS2 = new ArrayList<String>();
                    String[] temp = TestoPercorso.split("#");
                    for (int j=1; j < temp.length; j++){
                        Log.d("RIGA_" + j + "_" + IDPercorso[l], temp[j]);
                        if(temp[j].substring(0,2).contains("P")){//POI
                            String[] POI = temp[j].split("\\|");
                            String id = POI[1];
                            String description = POI[2];
                            Double lat = Double.parseDouble(POI[3]);
                            Double lng = Double.parseDouble(POI[4]);
                            String type = POI[5];

                            Marker poi = new IconMarker(description, lat,lng, 0, Color.DKGRAY, icon);
                            cachedMarkers.add(poi);

                        }
                    }



                }
            }


        }
    }catch (Exception e){
        Log.e("EXCEPTION", "> " + e);
    }



    return cachedMarkers;
}

public static String readFileAsString(String filePath) {

    String result = "";
    File file = new File(filePath);
    if ( file.exists() ) {
       FileInputStream fis = null;
        try {
           fis = new FileInputStream(file);
            char current;
            while (fis.available() > 0) {
                current = (char) fis.read();
                result = result + String.valueOf(current);

            }

        } catch (Exception e) {
            Log.d("TourGuide", e.toString());
        } finally {
            if (fis != null)
                try {
                    fis.close();
                } catch (IOException ignored) {
            }
        }

   }
    return result;
    }



}

1 个答案:

答案 0 :(得分:0)

我要感谢帮助我解决问题的教程作者。 我报告他的答案解决了我的问题:

不确定为什么你有这个限制,但这应该限制屏幕上绘制的标记数量。

在AugmentedView.java类中

您可以引入一个新的成员变量:

private static int MAX_NUM_TO_DRAW = 10;

然后在方法onDraw(Canvas canvas)中:

您可以提前退出绘图循环。

        int i=0;
        ListIterator<Marker> iter = collection.listIterator(collection.size());
        while (iter.hasPrevious() && i<MAX_NUM_TO_DRAW ) {
            Marker marker = iter.previous();
            marker.draw(canvas);
            i++;
        }