Tôi không hoàn toàn hài lòng với câu trả lời được chấp nhận ở trên, vì vậy tôi đã tự mình nghiên cứu thêm.
Mẹo mà tôi tin rằng họ đã sử dụng là họ truy xuất chế độ xem trên cùng trong hệ thống phân cấp chế độ xem được gọi DecorView
và thêm thanh tiến trình vào đó. Bằng cách đó, thanh tiến trình hiển thị cả trên thanh tác vụ VÀ khu vực nội dung. Lưu ý rằng câu trả lời của SD đặt thanh tiến trình vào vùng nội dung và 'đánh cắp' không gian khỏi nội dung thực tế, điều này có thể dẫn đến kết quả không mong muốn.
Ảnh chụp màn hình mẫu của việc triển khai này:
Mã
Chỉ cần đặt mã này vào onCreate
phương thức của một số hoạt động và nó sẽ hoạt động:
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);
}
});
Bạn có thể sử dụng đối số chiều cao của LayoutParams để đặt ProgressBar rộng hơn hoặc hẹp hơn, nhưng bạn có thể phải điều chỉnh độ -10
lệch.
Tạo kiểu
Thật không may, bạn có thể thấy nền xám xấu xí của thanh tiến trình. Để loại bỏ nó, chỉ cần tìm kiếm nền theo id và cố gắng ẩn nó không hoạt động. Để loại bỏ nền, tôi phải tạo bộ kéo giống hệt phiên bản hệ thống và xóa mục nền.
TL; DR: Tạo tệp progress_horizontal_holo_no_background_light.xml
và dán tệp có thể vẽ này:
<?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>
Sao chép các tệp có thể kéo .png thích hợp từ sdk/platforms/android-xx/data/res/drawable-xxx/
dự án của bạn và sau đó trong mã, bạn có thể thêm:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
Thêm: Thanh tiến trình không xác định
Phiên bản Pre-KitKat của thanh tiến trình không xác định khá xấu và chậm. Bạn có thể tải xuống tiến trình mượt mà mới được gọi ButteryProgressBar
. Chỉ cần tìm kiếm nó trên google (tôi không thể đăng bất kỳ liên kết nào nữa, vì tôi là người mới ở đây: [), thêm lớp vào dự án của bạn và bạn có thể chỉ cần thay thế ProgressBar trước đó bằng mã này và có thanh tiến trình không xác định giòn:
final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
Bạn cũng có thể cần đơn giản hóa mã này:
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();
}
mã này:
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)
Hy vọng tôi đã giúp :)