android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析
這里用SeekBar做演示,SeekBar繼承自ProgressBar,擁有其一切特性,并且其支持拖動以及DPAD左右鍵的進退。一起學習吧!
一、自定義SeekBar進度條樣式
原生SeekBar效果如圖
原生SeekBar樣式
1. 自定義SeekBar進度條樣式一
效果:顏色隨著進度從#00ff00到#0000ff漸變
布局文件
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="6dp"
android:progressDrawable="@drawable/progress_horizontal"
android:thumb="@drawable/seekbar_thumb" />
progressDrawable用來定義與進度有關的圖片。
res/drawable/progress_horizontal.xml
android:endColor="#0000ff"
android:startColor="#00ff00" />
thumb的和普通定義一個圖片一樣,這里就不貼代碼了。
progressDrawable工作原理
ProgressBar通過progressDrawable屬性拿到背景圖,如果該圖片是普通圖片,則進度和沒有進度看起來是一樣的。如果采用LayerDrawable作為背景圖,就可控制各個item的顯示部分,從而模擬進度,當進度為0時@android:id/background該item可以完全看到
@android:id/progress的item圖片會隨著進度的變化而顯示區域發生變化,例如進度為1%,該item圖也只會顯示1%,主要原理是標簽,該標簽對應ClipDrawable,其可以通過level值控制圖片的顯示部分,ProgressBar內部會隨著進度變化設置ClipDrawable的level,從而實現進度效果。
2. 自定義SeekBar進度條樣式二
效果:進度部分漸變保持不變,隨著進度拉長
解決思路就是不斷的更換進度部分圖片,不過簡單是進度部分可以是同一張圖片,只需要動態改變長度即可。
res/drawable/progress_drawable.xml
android:height="6dp"
android:gravity="center_vertical">
android:width="0px"
android:height="6dp"
android:gravity="center_vertical">
android:endColor="#0000ff"
android:startColor="#00ff00" />
不需要加id部分,將其作為一張普通圖片作為進度條背景。
實現思路:LayerDrawable默認最后的item顯示在最上層,那么我們可以將第一個item作為進度條的整體顏色,第二個item作為進度部分顏色。第二個item寬度為0,也象征著進度為0,當進度條進度發生變化時,我們根據進度相對于整個進度條的比例計算出進度部分的寬度,從而調整第二個item的寬度實現上圖效果。
布局文件保持不變,Java代碼更改如下
seekBar = findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progressTV.setText(progress + "%");
refreshProgressBackground(seekBar, progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
private void refreshProgressBackground(SeekBar seekBar, int progress) {
// 1. 得到LayerDrawable
LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(R.drawable.seekbar_drawable);
// seekBar顯示寬度
int avaliableWidth = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
// 進度部分寬度
int progressWidth = (int) (avaliableWidth * progress / (float) seekBar.getMax());
// 第二個item,下標為1
layerDrawable.setLayerWidth(1, progressWidth);
// 2. 重新設置ProgressDrawable
seekBar.setProgressDrawable(layerDrawable);
}
注釋1出之所以不直接通過seekBar獲取LayerDrawable,是因為在注釋2出的setProgressDrawable方法內會判斷Drawable和SeekBar以前所得到的progressDrawable是否相同,相同則不做任何操作,故每次需創建新的對象。
二、SeekBar及ProgressBar實現原理源碼分析
由于時間問題,該部分后續更新
總結
以上是生活随笔為你收集整理的android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对口单招计算机电工试题答案,对口单招电子
- 下一篇: 五个热门的免费Linux视频软件下载