2017-02-23 32 views
1

Мое приложение имеет форму с двумя изображениями. Первый загружается и округляется через ImageAdapter на лету, а второй - с темы. Они применяются к Button и положил рядом друг с другом, как показано ниже:Почему ширина моего заполнителя не сохраняется в URLImage (Codename One)

Part of app layout

В моей форме

Заполнитель в моей форме определяется как:

int imageWidth = (int) (Display.getInstance().getDisplayWidth()/2.5); 
EncodedImage placeholder = EncodedImage.createFromImage(Image.createImage(
      imageWidth, 
      imageWidth, 
      ParametresGeneraux.accentColor), true); 

Изображение, которое я применяю на кнопке, создается следующим образом:

reportImage = URLImage.createToStorage(placeholder, 
      Report.getFilename(chosenReport.getPhotoPath()), 
      chosenReport.getPhotoPath(), 
      ParametresGeneraux.RESIZE_SCALE_WITH_ROUND_MASK 
    ); 

Тогда я только потом

 System.err.println("The placeholder in FORM has a width of " + placeholder.getWidth()); // 432 

я получаю ширину 432 для заполнителя внутри FORM.

Однако из ImageAdapter

public final static URLImage.ImageAdapter RESIZE_SCALE_WITH_ROUND_MASK = new URLImage.ImageAdapter() { 
    @Override 
    public EncodedImage adaptImage(EncodedImage downloadedImage, EncodedImage placeholderImage) { 
     System.err.println("The placeholder in the ImageAdapter has a width of " + placeholderImage.getWidth()); 
     // ... 
    } 
}); 

Ширина заполнителем я получаю внутри ImageAdapter отличается со значением 200.

Где я должен посмотреть на ошибку, так как заполнитель Ширина должна быть одинаковой в обоих методах, не так ли?

Edit 2017-02-23: Важное примечание Перед показом этой формы, вовлеченное изображение уже загружен первый раз в другой форме с другим размером. И фактически сообщение от ImageAdapter (см. System.err()) не запускается. Я совершил облет, потому что загружено много изображений. См. Мой ответ для продолжения.

Любой намек оценил,

С уважением

+0

Вы используете GridLayout выше? – Diamond

+0

Нет, я не знаю. Кнопки добавляются позже (после этого вызова) через 'this.add (BorderLayout.centerCenter (BoxLayout.encloseX (reportImageButton, minimapButton))); 'с формой в Y-BoxLayout – HelloWorld

+0

В одиночку это не изменяет' this.add (BorderLayout.centerCenter (reportImageButton)); '. Ширина по-прежнему отличается. – HelloWorld

ответ

1

В конце концов оказалось, что

System.err.println("The placeholder in the ImageAdapter has a width of " + placeholderImage.getWidth());

отображается в консоли не было от ImageAdapter вызова в этой форме, но от предыдущей формы, которая фактически загрузил и показал одно и то же изображение в первый раз.

Так второй раз, когда я называю URLImage.createToStorage() с таким же внутренним именем (см Report.getFilename(chosenReport.getPhotoPath()) в моем вопросе) как файл уже был загружен и присутствует в кэше, он снова не загружен, как написано в doc:

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

Наконец, если я изменил внутреннее имя, а затем, даже если изображение получает скачан, весы прекрасно:

enter image description here

+2

В дополнение к этому, всегда очищайте папку '.cn1' хранения у пользователя компьютера HomePath при отладке URLImage. – Diamond

+0

Правильно, я добавил метод для этого (так как ваш [ответ отсюда] (http://stackoverflow.com/a/42240532/6351897) действительно!). 'if (Display.getInstance(). IsSimulator()) { String [] files = Storage.getInstance(). ListEntries(); для (String f: файлы) { if (f.endsWith ("jpg")) { Storage.getInstance(). DeleteStorageFile (f); System.out.println («Удалено следующее изображение» + f); } } System.err.println («Изображения успешно очищены на симуляторе!»); } ' – HelloWorld