в то время как я прокручиваю макет, требуется слишком много времени для прокрутки между картинками галереи. Есть ли способ сократить это время? - PullRequest
0 голосов
/ 09 января 2011

это мой первый вопрос здесь, хотя я уже давно читаю этот форум. Большинство ответов на мои сомнения отсюда:)

Возвращаясь к теме. Я разрабатываю приложение для Android. Я рисую динамический макет, который в основном представляет собой галереи, внутри LinearLayout, внутри ScrollView, внутри RelativeLayout. ScrollView является обязательным, потому что я рисую динамическое количество галерей, которые, скорее всего, не поместятся на экране.

Когда я выполняю прокрутку внутри макета, мне нужно подождать 3/4 секунды, пока ScrollView "деактивируется", чтобы иметь возможность прокрутки внутри галерей. Я хочу сократить это время до минимума. Желательно, чтобы я мог прокручивать галереи сразу после того, как убрал палец с экрана, хотя все, что меньше 2 секунд, также было бы здорово.

Я искал решение, но все, что я смог найти до сих пор, - это учебники по макету, которые не решали эту конкретную проблему. Я надеялся, что кто-то здесь знает, возможно ли это, и если да, то подскажу, как это сделать.

Я бы предпочел не использовать собственный ScrollView для решения этой проблемы. Но если это единственный способ, я был бы признателен за некоторую помощь, потому что я не совсем уверен, как бы я решил эту проблему, делая это.

это мой макет:

public class PicturesL extends Activity implements OnClickListener,
    OnItemClickListener, OnItemLongClickListener {


private ArrayList<ImageView> imageView = new ArrayList<ImageView>();

private StringBuilder PicsDate = new StringBuilder();

private CaWaApplication application;
private long ListID;

private ArrayList<Gallery> gallery = new ArrayList<Gallery>();
private ArrayList<Bitmap> Thumbails = new ArrayList<Bitmap>();
private String idioma;

private ArrayList<Long> Days = new ArrayList<Long>();
private long oldDay;
private long oldThumbsLoaded;
private ArrayList<Long> ThumbailsDays = new ArrayList<Long>();
private ArrayList<ArrayList<Long>> IDs = new ArrayList<ArrayList<Long>>();

@Override
public void onCreate(Bundle savedInstancedState) {
    super.onCreate(savedInstancedState);
    RelativeLayout layout = new RelativeLayout(this);
    ScrollView scroll = new ScrollView(this);
    LinearLayout realLayout = new LinearLayout(this);
    ArrayList<TextView> texts = new ArrayList<TextView>();



    Button TakePic = new Button(this);
    idioma = com.mateloft.cawa.prefs.getLang(this);
    if (idioma.equals("en")) {
        TakePic.setText("Take Picture");
    } else if (idioma.equals("es")) {
        TakePic.setText("Sacar Foto");
    }


    RelativeLayout.LayoutParams scrollLP =  new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.FILL_PARENT);

    layout.addView(scroll, scrollLP);

    realLayout.setOrientation(LinearLayout.VERTICAL);
    realLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));


    scroll.addView(realLayout);



    TakePic.setId(67);
    TakePic.setOnClickListener(this);
    application = (CaWaApplication) getApplication();

    ListID = getIntent().getExtras().getLong("listid");
    getAllThumbailsOfID();


    LinearLayout.LayoutParams TakeLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
            LinearLayout.LayoutParams.WRAP_CONTENT);



    realLayout.addView(TakePic);
    oldThumbsLoaded = 0;

    int galler = 100;

    for (int z = 0; z < Days.size(); z++) {


        ThumbailsManager croppedThumbs = new ThumbailsManager(Thumbails,
                oldThumbsLoaded, 
                ThumbailsDays.get(z));
        oldThumbsLoaded = ThumbailsDays.get(z);

        texts.add(new TextView(this));
        texts.get(z).setText("Day " + Days.get(z).toString());
        gallery.add(new Gallery(this));
        gallery.get(z).setAdapter(new ImageAdapter(this, croppedThumbs.getGallery(), 250, 175, true,
                ListID));
        gallery.get(z).setOnItemClickListener(this);
        gallery.get(z).setOnItemLongClickListener(this);
        gallery.get(z).setId(galler);
        galler++;

        realLayout.addView(texts.get(z));
        realLayout.addView(gallery.get(z));
    }


    Log.d("PicturesL", "ListID: " + ListID);





    setContentView(layout);
}

private void getAllThumbailsOfID() {

    ArrayList<ModelPics> Pictures = new ArrayList<ModelPics>();

    ArrayList<String> ThumbailsPath = new ArrayList<String>();

    Pictures = application.dataManager.selectAllPics();
    long thumbpathloaded = 0;
    int currentID = 0;
    for (int x = 0; x < Pictures.size(); x++) {

        if (Pictures.get(x).walkname == ListID) {

            if (Days.size() == 0) { Days.add(Pictures.get(x).day); oldDay = Pictures.get(x).day; 
            IDs.add(new ArrayList<Long>()); currentID = 0; }

            if (oldDay != Pictures.get(x).day) {
                oldDay = Pictures.get(x).day;
                ThumbailsDays.add(thumbpathloaded);
                Days.add(Pictures.get(x).day);
                IDs.add(new ArrayList<Long>());
                currentID++;




            }


            StringBuilder tpath = new StringBuilder();
            tpath.append(Pictures.get(x).path.substring(0,
                    Pictures.get(x).path.length() - 4));
            tpath.append("-t.jpg");
            IDs.get(currentID).add(Pictures.get(x).id);
            ThumbailsPath.add(tpath.toString());

            thumbpathloaded++;

            if (x == Pictures.size() - 1) {
                Log.d("PicturesL", "El ultimo de los arrays, tamaño: " + Days.size());
                ThumbailsDays.add(thumbpathloaded);


            }
        }

    }

    for (int y = 0; y < ThumbailsPath.size(); y++) {
        Thumbails.add(BitmapFactory.decodeFile(ThumbailsPath.get(y)));

    }

}

У меня произошла утечка памяти при другой активности, когда изменилась ориентация экрана, которая делала его медленнее, теперь он работает лучше. Скроллер не блокируется. Но иногда, когда он прекращает прокрутку, требуется несколько секунд (2/3), чтобы отключить себя. Я просто хочу, чтобы он был немного более динамичным, есть ли способ переопределить слушателя и заставить его перестать прокручивать ON_ACTION_UP или что-то в этом роде?

Я не хочу использовать просмотр списка, потому что я хочу, чтобы каждая галерея была отделена от других представлений, теперь у меня просто есть текст, но я, вероятно, разделю их с изображениями другого размера, чем галереи.

Я не совсем уверен, возможно ли это с listadapter и listview, я предположил, что представление может обрабатывать только один тип объекта, поэтому я использую scrollview макета, если я ошибаюсь поправьте меня пожалуйста:)

Также это действие работает в качестве предварительного просмотра или выбора изображений, которые вы хотите просмотреть в полном размере, и управления их значениями. Так что работает только с миниатюрами. Каждый весит 40 кб. Предполагая, что маловероятно, что пользователь получит более 1000 ~ 1500 изображений в этом представлении, я подумал, что в этом случае активность не будет использовать более 40 ~ 50 МБ ОЗУ, добавив еще 10, если я открою полноразмерное представление. Так что я догадался, что большинство устройств могут отображать это представление в полном размере. Если это не работает на устройствах низкого уровня, я планировал добавить опцию в настройках приложения, чтобы позволить пользователю выбирать это представление в соответствии с некоторыми значениями базы данных.

И последняя причина заключается в том, что в течение большей части этого действия «жизненный цикл» (в приложении есть картинки, которые имеют отношение к представлению, когда оно заканчивается, значение, которое выбирает, какие отображаемые изображения должны измениться, и больше не будет изображений. добавлено внутри этого экземпляра этой деятельности); представление будет незаселенным, поэтому большую часть времени показывать все будет дорого, только в конце цикла

Это было более или менее то, что я думал, когда создавал этот макет. Я открыт для любых предложений или мнений, я только что создал этот макет несколько дней назад и пытаюсь понять, может ли он работать правильно, потому что он соответствует потребностям моего приложения. Хотя, если есть лучший способ, я бы хотел услышать это

PD: Я пытаюсь понять, сколько он на самом деле может нарисовать. Мне удалось нарисовать 530 галерей с 600 миниатюрами на одном и том же макете, приложение использует 42 МБ, и у меня нет доступа к большему объему памяти, чтобы впоследствии запустить мой полноразмерный просмотр :(. Я пытался сделать то же самое с 1000, но выдает ошибку OutOfMemory, размер растрового изображения превышает бюджет виртуальной машины. Можно ли как-нибудь увеличить объем доступной памяти на устройствах высокого класса? Или я должен попытаться найти способ не рисовать все сразу? Будет ли просмотр списка работать более чем на один тип объекта?

Спасибо

Mateo

1 Ответ

0 голосов
/ 09 января 2011

Почему бы не сделать ваши галереи элементами списка?Таким образом, вам не придется сразу их раздувать, и вы сможете воспользоваться механизмом повторного использования списка.Некоторая медлительность, которую вы видите, может быть вызвана очень интенсивным использованием памяти.Галереи не совсем легкие виджеты, поэтому вы можете увидеть паузы из-за большой активности GC, как только перестанете прокручивать.ListView с адаптером также позволил бы вам лениво связывать галереи со списком, так что во время броска вы не делаете дорогостоящее связывание галерей.

...