我对上面接受的答案并不完全满意,所以我自己做了一些额外的研究。
我相信他们使用的技巧是,他们在称为 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的height参数来将progressBar设置为更宽或更窄,但是您可能必须调整-10
偏移量。
造型
不幸的是,您可以看到进度条的难看的灰色背景。要删除它,仅通过id搜索背景并尝试隐藏它是行不通的。要删除背景,我必须创建与系统版本相同的对象,并删除背景项。
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之前版本非常丑陋和缓慢。您可以下载名为的新的平滑progressBar 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)
希望我能帮到:)