版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)百分比下載進(jìn)度條效果
這篇文章將為大家詳細(xì)講解有關(guān)Android如何實(shí)現(xiàn)百分比下載進(jìn)度條效果,在下覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。現(xiàn)在很多APP中都會(huì)集成下載功能,所以有一個(gè)方便好看又實(shí)用的進(jìn)度條來(lái)展示下載進(jìn)度很有必要,也能提高用戶體驗(yàn),在這里我就把項(xiàng)目里的下載進(jìn)度條抽取出來(lái)分享給大家,話不多說(shuō),先看效果圖:這個(gè)進(jìn)度條是自定義的一個(gè)View,其中有一個(gè)自定義屬性就是百分比文字的大?。ㄒ部梢园涯莾蓷l顯示顏色的進(jìn)度條自定義屬性,這里就沒有實(shí)現(xiàn),在代碼里面寫的)。先說(shuō)說(shuō)實(shí)現(xiàn)原理:1:由于自定義了屬性,所以先獲取屬性的值。2:繪制底色那條灰色的線。3:根據(jù)傳入的數(shù)據(jù)計(jì)算當(dāng)前百分比,然后繪制那條橘黃色的線。4:再在橘黃色線后面把百分比的文字繪制出來(lái)就OK了?,F(xiàn)在來(lái)看看代碼:一:屬性設(shè)置attrs.xml文件<?xml
version="1.0"
encoding="utf-8"?>
<resources>
<declare-styleable
name="downloadProgressBar">
<attr
name="dptextsize"
format="dimension"/>
</declare-styleable>
</resources>其中dptextsize就是自定義屬性的名字二:自定義viewDownLoadProgressbar.Javapackage
com.ywl5320.downloadprogressdemo.downloadview;
import
android.content.Context;
import
android.content.res.TypedArray;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.graphics.Rect;
import
android.util.AttributeSet;
import
android.view.View;
import
android.view.ViewTreeObserver.OnGlobalLayoutListener;
import
com.ywl5320.downloadprogressdemo.R;
/**
*
下載進(jìn)度條
*
*
@author
ywl
*
*/
public
class
DownLoadProgressbar
extends
View
{
private
Paint
paint
=
new
Paint();
//
繪制背景灰色線條畫筆
private
Paint
paintText
=
new
Paint();
//
繪制下載進(jìn)度畫筆
private
float
offset
=
0f;
//
下載偏移量
private
float
maxvalue
=
0f;
//
下載的總大小
private
float
currentValue
=
0f;
//
下載了多少
private
Rect
mBound
=
new
Rect();
//
獲取百分比數(shù)字的長(zhǎng)寬
private
String
percentValue
=
"0%";
//
要顯示的現(xiàn)在百分比
private
float
offsetRight
=
0f;
//
灰色線條距離右邊的距離
private
int
textSize
=
25;
//
百分比的文字大小
private
float
offsetTop
=
18f;
//
距離頂部的偏移量
public
DownLoadProgressbar(Context
context)
{
this(context,
null);
//
TODO
Auto-generated
constructor
stub
}
public
DownLoadProgressbar(Context
context,
AttributeSet
attribute)
{
this(context,
attribute,
0);
}
public
DownLoadProgressbar(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
//
TODO
Auto-generated
constructor
stub
//
獲取自定義屬性,給textsize賦初始值
TypedArray
t
=
getContext().obtainStyledAttributes(attrs,
R.styleable.downloadProgressBar);
textSize
=
(int)
t.getDimension(
R.styleable.downloadProgressBar_dptextsize,
36);
getTextWidth();
}
@Override
protected
void
onDraw(Canvas
canvas)
{
//
TODO
Auto-generated
method
stub
super.onDraw(canvas);
//
繪制底色
paint.setColor(getResources().getColor(R.color.no1_gray_light));
paint.setStrokeWidth(1);
canvas.drawLine(0,
offsetTop,
getWidth(),
offsetTop,
paint);
//
繪制進(jìn)度條顏色
paint.setColor(getResources().getColor(R.color.no2_orange));
paint.setStrokeWidth(2);
canvas.drawLine(0,
offsetTop,
offset,
offsetTop,
paint);
//
繪制白色區(qū)域及百分比
paint.setColor(getResources().getColor(R.color.no3_white));
paint.setStrokeWidth(1);
paintText.setColor(getResources().getColor(R.color.no2_orange));
paintText.setTextSize(textSize);
paintText.setAntiAlias(true);
paintText.getTextBounds(percentValue,
0,
percentValue.length(),
mBound);
canvas.drawLine(offset,
offsetTop,
offset
+
mBound.width()
+
4,
offsetTop,
paint);
canvas.drawText(percentValue,
offset,
offsetTop
+
mBound.height()
/
2
-
2,
paintText);
}
/**
*
設(shè)置當(dāng)前進(jìn)度值
*
*
@param
currentValue
*/
public
void
setCurrentValue(float
currentValue)
{
this.currentValue
=
currentValue;
int
value
=
(int)
(this.currentValue
/
maxvalue
*
100);
if
(value
<
100)
{
percentValue
=
value
+
"%";
}
else
{
percentValue
=
"100%";
}
initCurrentProgressBar();
invalidate();
}
/**
*
設(shè)置最大值
*
*
@param
maxValue
*/
public
void
setMaxValue(float
maxValue)
{
this.maxvalue
=
maxValue;
}
/**
*
獲取當(dāng)前進(jìn)度條長(zhǎng)度
*
*
@param
maxValue
*
@param
currentValue
*
@return
*/
public
void
initCurrentProgressBar()
{
getViewTreeObserver().addOnGlobalLayoutListener(new
OnGlobalLayoutListener()
{
@Override
public
void
onGlobalLayout()
{
//
TODO
Auto-generated
method
stub
if
(currentValue
<
maxvalue)
{
offset
=
(getWidth()
-
offsetRight)
*
currentValue
/
maxvalue;
}
else
{
offset
=
getWidth()
-
offsetRight;
}
}
});
}
/**
*
獲取“100%”的寬度
*/
public
void
getTextWidth()
{
Paint
paint
=
new
Paint();
Rect
rect
=
new
Rect();
paint.setTextSize(textSize);
paint.setAntiAlias(true);
paint.getTextBounds("100%",
0,
"100%".length(),
rect);
offsetRight
=
rect.width()
+
5;
}
}這就是實(shí)現(xiàn)代碼,代碼不多,注解也有,不是很難。使用時(shí)只需傳入文件最大值,當(dāng)前下載了多少就能自動(dòng)計(jì)算出百分比。如果循環(huán)傳入,就實(shí)現(xiàn)了動(dòng)態(tài)跑動(dòng)的效果。三:Activity布局文件activity_main.xml<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
xmlns:ywl="/apk/res/com.ywl5320.downloadprogressdemo"
<!--
這就是為自定義屬性添加命名空間,注意res后的是:程序包名-->
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/no3_white"
tools:context="${relativePackage}.${activityClass}"
>
<TextView
android:id="@+id/tv_start"
android:layout_width="match_parent"
android:layout_height="50dip"
android:layout_below="@+id/rl_progress"
android:layout_marginTop="40dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:gravity="center"
android:background="@drawable/btn_blue_selector"
android:text="開始"/>
<RelativeLayout
android:id="@+id/rl_progress"
android:layout_width="match_parent"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="30dip"
android:layout_height="50dip">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dip"
android:textColor="@color/no5_gray_silver"
android:textSize="12sp"
/>
<TextView
android:id="@+id/tv_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="6dip"
android:textColor="@color/no5_gray_silver"
android:textSize="12sp"
/>
<com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar
android:id="@+id/dp_game_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ywl:dptextsize="14sp"
<!--
這里設(shè)置控件的字體大小為14sp
-->
android:layout_below="@+id/tv_size">
</com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar>
</RelativeLayout>
</RelativeLayout>程序中的文件大小,當(dāng)前下載量和下載速度,都是在這里布局的,用的時(shí)候可以動(dòng)態(tài)設(shè)置就行了,也可以把這個(gè)布局文件封裝為listview的item布局文件,那樣就可以制作下載列表了。四:MainAcativity.javapackage
com.ywl5320.downloadprogressdemo;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.TextView;
import
com.ywl5320.downloadprogressdemo.downloadview.DownLoadProgressbar;
public
class
MainActivity
extends
Activity
{
private
TextView
mStart;
private
TextView
mSize;
private
TextView
mSpeed;
private
DownLoadProgressbar
mProgress;
private
int
max
=
100;
//總的大小
private
int
current
=
0;
//當(dāng)前下載大小
private
String
speed
=
"1";
//下載速度
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStart
=
(TextView)
findViewById(R.id.tv_start);
mProgress
=
(DownLoadProgressbar)
findViewById(R.id.dp_game_progress);
mSize
=
(TextView)
findViewById(R.id.tv_size);
mSpeed
=
(TextView)
findViewById(R.id.tv_speed);
//初始化下載進(jìn)度
mSize.setText(current
+
"MB/"
+
max
+
"MB");
//初始化下載速度
mSpeed.setText(speed
+
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年國(guó)際旅游服務(wù)與市場(chǎng)營(yíng)銷合同
- 住房簡(jiǎn)易合同模板
- 個(gè)人聯(lián)營(yíng)合作合同范例
- 品牌服務(wù)授權(quán)合同范例
- 城建項(xiàng)目合同范例
- 2024年度航空港建設(shè)與安裝合同
- 2024年度安全生產(chǎn)責(zé)任合規(guī)與風(fēng)險(xiǎn)控制合同
- 2024年保險(xiǎn)合同標(biāo)的及服務(wù)細(xì)節(jié)
- 債權(quán)轉(zhuǎn)讓居間服務(wù)合同范例
- 修補(bǔ)雨棚天溝合同范例
- 稅務(wù)代理合同模板
- 出租車行業(yè)管理方案
- 【課件】第四章《第三節(jié)平面鏡成像》課件人教版物理八年級(jí)上冊(cè)
- DB34∕T 2290-2022 水利工程質(zhì)量檢測(cè)規(guī)程
- 2024年中國(guó)彩屏GPS手持機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2024年廣東省清遠(yuǎn)市佛岡縣事業(yè)單位公開招聘工作人員歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 文印競(jìng)標(biāo)合同范本
- 2024年廣東省深圳市中考?xì)v史試題
- 2024至2030年全球及中國(guó)強(qiáng)光手電筒行業(yè)發(fā)展現(xiàn)狀調(diào)研及投資前景分析報(bào)告
- 2024年秋新教材北師大版一年級(jí)數(shù)學(xué)上冊(cè)全冊(cè)課件
- 加氣站質(zhì)量管理手冊(cè)樣本
評(píng)論
0/150
提交評(píng)論