Используйте свойство - FittedBox
- fit:
для настройки ведущего виджета.
leading: FittedBox(
fit: BoxFit.cover,
child: FlatButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, // add this to remove padding.
onPressed: () {},
child: Text(
"Back",
// textDirection: TextDirection.ltr,
style: TextStyle(
color: Colors.white,
fontFamily: "Raleway-Medium",
fontSize: 14.0,
),
),
),
),
JPEG имеет специальный режим кодирования, называемый «Прогрессивный JPEG», в котором данные сжимаются в несколько проходов с постепенно увеличивающейся детализацией. Windows 7 имеет встроенную поддержку .
Я не думаю, что вы справитесь с этим, используя встроенные методы .NET Framework, так как они сначала прочитают полное изображение, а затем отобразят его. Вам нужно будет либо найти какую-нибудь другую библиотеку, которая поддерживает отображение частично загруженных изображений, либо написать собственный анализатор.
Когда вы начнете запрос, проверьте свойство WebResponse.ContentLength , которое должно дать вам общее количество байтов, которое следует ожидать. Затем следите за общим количеством прочитанных байтов в вашем методе ReadCallback. В остальном должно быть очевидно. :)
[edit] Упс, я перечитал вопрос, и это было не совсем то, что вы хотели. Я все еще оставляю это на всякий случай, на случай, если кто-то может извлечь из этого пользу.
Я хотел бы показать прогресс загрузка, как это делают браузеры, и не показывать только по окончании.
У вас есть два варианта:
Использовать WebClient.DownloadDataAsync
. Это вызовет события прогресса через DownloadProgressChanged
и предоставит окончательное уведомление о том, когда данные станут доступны через событие DownloadDataCompleted
. В этот момент вы можете назначить изображение, скажем, PictureBox
.
Если вы загружаете изображение, чтобы в конечном итоге отобразить его в элементе управления PictureBox
, тогда это может быть даже проще. просто пойти с PictureBox.LoadAsync
. Это также обеспечит обновления прогресса посредством его события LoadProgressChanged
и, наконец, LoadCompleted
по завершении.
У вас проблема с элементом управления PictureBox, а не с частичной загрузкой.
Хакерство заключается в использовании WebBrowserControl, поскольку IE может показывать частичные изображения.
Возможно, вы сможете это сделать, однако для этого потребуются некоторые дополнительные знания о структуре файлов gif. Wotsit.org имеет несколько ссылок на документы структуры gif, чтобы вы могли начать.
Общий подход будет заключаться в том, чтобы взять ваши общие накопленные данные и с конца искать назад, пока не найдете конец терминатор блока. Данные между этим последним допустимым блоком и концом потока завершены только частично и должны считаться ненужными. Вы хотите удалить его и добавить в поток завершающий блок файла. Затем вы сможете загрузить этот отредактированный поток в PictureBox.
Есть событие, которое вы можете использовать в асинхронном веб-запросе загрузки, который периодически вызывается и позволяет вам напрямую обновлять элемент управления ProgressBar. Вот пример того, как я использовал это событие:
delegate void SetProgressDelegate(int percentComplete);
/// <summary>
/// A thread-safe method for updating the file download progress bar.
/// </summary>
/// <param name="bytesReceived"></param>
/// <param name="totalBytes"></param>
void SetDownloadProgress(int percentComplete)
{
if (this.InvokeRequired)
{
SetProgressDelegate d = new SetProgressDelegate(SetDownloadProgress);
this.Invoke(d, new object[] { percentComplete });
}
else
{
this.progressFileDownload.Value = percentComplete;
}
}
/// <summary>
/// Event handler to update the progress bar during file download.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void web_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
SetDownloadProgress(e.ProgressPercentage);
}
А вот как я подключаю событие и начинаю загрузку:
WebClient web = new WebClient();
web.DownloadFileCompleted += new AsyncCompletedEventHandler(web_DownloadFileCompleted);
web.DownloadProgressChanged += new DownloadProgressChangedEventHandler(web_DownloadProgressChanged);
web.DownloadFileAsync(sourceUri, destinationFileName);
Ваше решение считывает файл прямо в память, а мое сохраняет его в файл на диске, поэтому это решение может работать или не работать для вас. Если для вас важно отображение индикатора выполнения, этот метод работает, и вы всегда можете загрузить его во временный файл, а затем загрузить этот файл в элемент управления изображением после его завершения.