Я сделал это, и он работает неплохо, не стесняйтесь изменять подпись метода в соответствии с вашими типами переменных или также с типом возврата, возможно, вы хотели бы получить объект TimeSpan или только секунды ...
///
/// Calculates the eta.
///
/// When the process started
/// How many items are being processed
/// How many items are done
/// A string representing the time left
private string CalculateEta(DateTime processStarted, int totalElements, int processedElements)
{
int itemsPerSecond = processedElements / (int)(processStarted - DateTime.Now).TotalSeconds;
int secondsRemaining = (totalElements - processedElements) / itemsPerSecond;
return new TimeSpan(0, 0, secondsRemaining).ToString();
}
Вам потребуется инициализировать переменную DateTime
при запуске обработки и отправить ее методу на каждой итерации.
Не забывайте, что, вероятно, ваше окно будет заблокировано, если процесс довольно длинный, поэтому, когда вы помещаете возвращаемое значение в элемент управления, не забудьте использовать его метод .Refresh()
.
Если вы используете потоки, вы можете попытаться установить текст используя метод Invoke(Action)
, было бы легче использовать этот метод расширения для легкого архивирования .
Если вы используете консольное приложение, то вам не должно быть проблем с отображением вывода строка за строкой.
Надеюсь, что это кому-то поможет.
В макете XML для вашего индикатора выполнения установите android:layout_gravity
(вместо android:gravity
) значение "center"
android:layout_gravity = "center"
Использовать
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_centerInParent="true"
Пример:
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_centerInParent="true" />
android:gravity
атрибут не поддерживается в ProgressBar
FrameLayout
не имеет android:gravity
. Вам нужно установить android:layout_gravity
вместо ProgressBar
.
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
***android:layout_gravity="center"*** />
добавить эту строку в
<ProgressBar
android:layout_gravity="center" />
Просто измените свой Layout на RelativeLayout и добавьте android: layout_centerInParent = "true" в свой ProgressBar.
<ProgressBar
android:id="@+id/progBar"
android:indeterminateDrawable="@drawable/my_progress_indeterminate"
android:layout_height="50dp"
android:layout_centerInParent="true"
android:layout_width="50dp">
</ProgressBar>
Начиная с 2018 года, вам нужно установить следующий атрибут:
android:layout_centerInParent="true"
Рабочий раствор по состоянию на 2017 год
android:layout_gravity="center"
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_centerInParent="true"
/>
Вы должны установить положение в пикселях, так как в структуре кадра различные компоненты перекрывают друг друга. Итак, вы можете попробовать это, установив пиксели в dip.