Я не был полностью удовлетворен принятым ответом выше, поэтому я сам провел дополнительное исследование.
Уловка, которую, как мне кажется, они использовали, заключалась в том, что они извлекли вид сверху в вызванной иерархии представлений DecorView
и добавили туда индикатор выполнения. Таким образом, индикатор выполнения будет отображаться как над панелью действий, так и над областью содержимого. Обратите внимание, что ответ SD помещает индикатор выполнения в область содержимого и «крадет» пространство у фактического содержимого, что может привести к неожиданным результатам.
Примеры скриншотов этой реализации:
Код
Просто поместите этот код в onCreate
метод какой-либо активности, и он должен работать:
final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
progressBar.setProgress(65);
final FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
decorView.addView(progressBar);
ViewTreeObserver observer = progressBar.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
View contentView = decorView.findViewById(android.R.id.content);
progressBar.setY(contentView.getY() - 10);
ViewTreeObserver observer = progressBar.getViewTreeObserver();
observer.removeOnGlobalLayoutListener(this);
}
});
Вы можете поиграть с аргументом высоты LayoutParams, чтобы установить progressBar шире или уже, но вам, возможно, придется настроить -10
смещение.
Укладка
К сожалению, вы можете увидеть уродливый серый фон индикатора выполнения. Чтобы удалить его, просто найдите фон по идентификатору и попытайтесь его скрыть. Для удаления фона мне пришлось создать идентичный чертеж системной версии и удалить элемент фона.
TL; DR: создайте файл progress_horizontal_holo_no_background_light.xml
и вставьте его:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_secondary_holo_light" />
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_primary_holo_light" />
</item>
</layer-list>
Скопируйте соответствующие чертежи .png из sdk/platforms/android-xx/data/res/drawable-xxx/
в свой проект, а затем в код вы можете добавить:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Дополнительно: неопределенный индикатор выполнения
Версии неопределенных индикаторов выполнения до KitKat довольно уродливы и медлительны. Вы можете скачать новый плавный прогрессБар под названием ButteryProgressBar
. Просто найдите его в Google (я не могу публиковать больше ссылок, потому что я здесь новичок: [), добавьте класс в свой проект, и вы можете просто заменить предыдущий ProgressBar этим кодом и получить четкую неопределенную полосу выполнения:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
Вам также может потребоваться упростить этот код:
final TypedArray ta = c.obtainStyledAttributes(attrs, R.styleable.ButteryProgressBar);
try {
mBarColor = ta.getColor(R.styleable.ButteryProgressBar_barColor,
c.getResources().getColor(android.R.color.holo_blue_light));
mSolidBarHeight = ta.getDimensionPixelSize(
R.styleable.ButteryProgressBar_barHeight,
Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity));
mSolidBarDetentWidth = ta.getDimensionPixelSize(
R.styleable.ButteryProgressBar_detentWidth,
Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity));
} finally {
ta.recycle();
}
к этому коду:
mBarColor = c.getResources().getColor(android.R.color.holo_blue_light)
mSolidBarHeight = Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity)
mSolidBarDetentWidth = Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity)
Надеюсь, я помог :)