Android ждет, пока изображение не загрузится в ImageView - PullRequest
0 голосов
/ 26 июня 2011

У меня проблема с прокруткой изображений на диске, которые достаточно велики (около 1 МБ каждое). Теперь у меня проблема не в задержке между изображениями, а в том, что при загрузке изображения прокручивается изображение (которое я использую)сигнализировать об изменении) продолжает обнаруживаться, пока изображение загружается, что приводит к перемещению изображения при окончательной загрузкеМой вопрос прост.Есть ли способ подождать, пока изображение загрузится (таким образом я могу блокировать экранные команды, пока изображение не будет полностью загружено).

Спасибо за любые ответы!

PD: Кстати, язагружаю страницы в ImageView;

РЕДАКТИРОВАТЬ:

Отправка AsyincCode:

Это в моей тестовой деятельности itests.java

public class ImageLoader extends AsyncTask<String, Void, Void > {
    private final ProgressDialog Loading = new ProgressDialog(itests.this);

    protected void onPreExecute(){
        Loading.setMessage("Loading...");
        Loading.show();
    }

    @Override
    protected Void doInBackground(String... params) {
            pvm.setPages(params[0], params[1], params[2]);
        return null;
    }

    protected void onPostExecute(Void... params){
        if (Loading.isShowing()){
            Loading.dismiss();
        }
    }

Теперь pvm - это мой PageViewManager (PageView - это мой пользовательский ImageView, который получает все мои сенсорные события)

Вот что он делает:

public void setPages(String left, String center, String right){
    //if (!timer.isAlive()){
        Left = left;
        Center = center;
        Right = right;
        DoublePageMode = true;
        toggleDoublePageMode();
        System.err.println("Waiting...");
        //centerPage.blockCommands();
        //timer.start();
    //}
}

@Override
public void toggleDoublePageMode(){
    if (DoublePageMode){
        //Going into Normal View
        threePageLayout.setOrientation(LinearLayout.HORIZONTAL);
        leftPage.setVisibility(View.VISIBLE);
        LinearLayout.LayoutParams cll = new  LinearLayout.LayoutParams(DWidth,DHeight);
        LinearLayout.LayoutParams zero = new LinearLayout.LayoutParams(0,DHeight);
        centerPage.setImage(Center, DWidth, DHeight, PageState.NORMAL);
        centerPage.setLayoutParams(cll);
        leftPage.setImage(Left, DWidth, DHeight, PageState.NORMAL);
        leftPage.setLayoutParams(zero);
        rightPage.setImage(Right, DWidth, DHeight, PageState.NORMAL);
        rightPage.setLayoutParams(zero);
        DoublePageMode = false;
    }
    else{
        DoublePageMode = true;
        threePageLayout.setOrientation(LinearLayout.VERTICAL);
        leftPage.setVisibility(View.GONE);
        LinearLayout.LayoutParams cll = new LinearLayout.LayoutParams(DWidth,DHeight,1f);
        LinearLayout.LayoutParams zero = new LinearLayout.LayoutParams(DWidth,DHeight,1f);
        centerPage.setImage(Center, DWidth, DHeight, PageState.TWOPAGEMODE);
        centerPage.setLayoutParams(cll);
        rightPage.setImage(Right, DWidth, DHeight, PageState.TWOPAGEMODE);
        rightPage.setLayoutParams(zero);            
    }
}

Запись @Override заключается в том, что функция также должнавызываться из PageView на LongTouch.Однако я не делаю длинных нажатий, так что это не проблема.Поскольку AsyncTask пытается переместить макет действия, показывающего изображения, я получил сообщение об ошибке, которое я вам сказал. Это имеет смысл.

Когда мне нужно вызвать этот метод, он исходит из этого кода (в itests.java):

public void movePages(boolean next) {       
            //Code that initializes left,center,right
            new ImageLoader().execute(left, center, right);
}

Этот метод вызывается PageViewManager (pvm) через интерфейс.

Надеюсь, это даст вам представление!

Большое спасибо!

EDIT2:

Я решил это!На самом деле больше похоже на то, что я нашел способ обойти это, но я прекрасно работаю!

Все, что я сделал, - это создал класс Timer, который позволяет мне знать, когда прошло определенное время.Когда мне нужно загрузить изображения, я запускаю его (это другой поток) и устанавливаю логическое значение, которое заставляет мои страницы игнорировать сенсорные события (возвращая false в onTouchEvent).Когда это будет сделано, я вызову функцию в моем pvm, которая просто снова установит для этого логического значения значение true, и эффект будет именно тем, что я хотел.Таймер ждет только около 500 миллисекунд.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Одно (длинное) решение, о котором я могу подумать, это реализовать свой собственный класс ImageView, который загружает BitmapDrawable и рисует его в onDraw ().Таким образом, вы можете точно знать, когда завершится onDraw (), и вызвать другой обратный вызов (например, onDrawComplete ()) для переключения обработки событий касания.

0 голосов
/ 26 июня 2011

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

pDialog = ProgressDialog.show(this, "Loading Data", "Please Wait...", true);

перед тем, как вы начнете загружать данные, а затем, когда все ваши данные будут готовы, просто позвоните pDialog.dismiss();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...