日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析

發(fā)布時間:2023/12/29 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里用SeekBar做演示,SeekBar繼承自ProgressBar,擁有其一切特性,并且其支持拖動以及DPAD左右鍵的進(jìn)退。一起學(xué)習(xí)吧!

一、自定義SeekBar進(jìn)度條樣式

原生SeekBar效果如圖

原生SeekBar樣式

1. 自定義SeekBar進(jìn)度條樣式一

效果:顏色隨著進(jìn)度從#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用來定義與進(jìn)度有關(guān)的圖片。

res/drawable/progress_horizontal.xml

android:endColor="#0000ff"

android:startColor="#00ff00" />

thumb的和普通定義一個圖片一樣,這里就不貼代碼了。

progressDrawable工作原理

ProgressBar通過progressDrawable屬性拿到背景圖,如果該圖片是普通圖片,則進(jìn)度和沒有進(jìn)度看起來是一樣的。如果采用LayerDrawable作為背景圖,就可控制各個item的顯示部分,從而模擬進(jìn)度,當(dāng)進(jìn)度為0時@android:id/background該item可以完全看到

@android:id/progress的item圖片會隨著進(jìn)度的變化而顯示區(qū)域發(fā)生變化,例如進(jìn)度為1%,該item圖也只會顯示1%,主要原理是標(biāo)簽,該標(biāo)簽對應(yīng)ClipDrawable,其可以通過level值控制圖片的顯示部分,ProgressBar內(nèi)部會隨著進(jìn)度變化設(shè)置ClipDrawable的level,從而實現(xiàn)進(jìn)度效果。

2. 自定義SeekBar進(jìn)度條樣式二

效果:進(jìn)度部分漸變保持不變,隨著進(jìn)度拉長

解決思路就是不斷的更換進(jìn)度部分圖片,不過簡單是進(jìn)度部分可以是同一張圖片,只需要動態(tài)改變長度即可。

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部分,將其作為一張普通圖片作為進(jìn)度條背景。

實現(xiàn)思路:LayerDrawable默認(rèn)最后的item顯示在最上層,那么我們可以將第一個item作為進(jìn)度條的整體顏色,第二個item作為進(jìn)度部分顏色。第二個item寬度為0,也象征著進(jìn)度為0,當(dāng)進(jìn)度條進(jìn)度發(fā)生變化時,我們根據(jù)進(jìn)度相對于整個進(jìn)度條的比例計算出進(jìn)度部分的寬度,從而調(diào)整第二個item的寬度實現(xiàn)上圖效果。

布局文件保持不變,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();

// 進(jìn)度部分寬度

int progressWidth = (int) (avaliableWidth * progress / (float) seekBar.getMax());

// 第二個item,下標(biāo)為1

layerDrawable.setLayerWidth(1, progressWidth);

// 2. 重新設(shè)置ProgressDrawable

seekBar.setProgressDrawable(layerDrawable);

}

注釋1出之所以不直接通過seekBar獲取LayerDrawable,是因為在注釋2出的setProgressDrawable方法內(nèi)會判斷Drawable和SeekBar以前所得到的progressDrawable是否相同,相同則不做任何操作,故每次需創(chuàng)建新的對象。

二、SeekBar及ProgressBar實現(xiàn)原理源碼分析

由于時間問題,該部分后續(xù)更新

總結(jié)

以上是生活随笔為你收集整理的android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。