Android自定義View 使用PathMeasure簡(jiǎn)單模仿系統(tǒng)ProgressBar(四)
使用PathMeasure簡(jiǎn)單模仿系統(tǒng)ProgressBar,效果如下:

還蠻像的吧,有的人問(wèn)了,系統(tǒng)自帶的你閑的搞這個(gè)干嘛,當(dāng)然是純粹為了學(xué)習(xí)PathMeasure這個(gè)類。
PathMeasure是用來(lái)測(cè)量Path路徑的,可以截取路徑中某一段路徑,通過(guò)改變這段路徑的起點(diǎn)、終點(diǎn),達(dá)到類似VectorDrawable中的路徑動(dòng)畫(huà)效果:
直接new就可以獲得PathMeasure對(duì)象:
PathMeasure pathMeasure = new PathMeasure();
或者
PathMeasure pathMeasure = new PathMeasure(path, forceClosed);
其中path代表一個(gè)Path對(duì)象,forceClosed代表你測(cè)量的path是否閉合,如果為true,那么測(cè)量長(zhǎng)度的時(shí)候周長(zhǎng)會(huì)按path.close()來(lái)算。
也可以調(diào)用以下方法設(shè)置路徑:
pathMeasure.setPath(path, forceClosed);
獲得路徑的長(zhǎng)度:
float length = pathMeasure.getLength();
截取路徑,新截取到的賦值給一個(gè)新Path對(duì)象mDstPath
pathMeasure.getSegment(start, stop, mDstPath, true);
其中start和stop為起止長(zhǎng)度,第四個(gè)參數(shù)代表是否startWithMoveTo,是否從moveTo位置開(kāi)始,一般為true。
要實(shí)現(xiàn)上面的效果,那就用屬性動(dòng)畫(huà)寫(xiě)一個(gè)0到1的百分比,根據(jù)當(dāng)前的百分比和原路徑的長(zhǎng)度,動(dòng)態(tài)改變新路徑的起止點(diǎn)長(zhǎng)度:
1、寫(xiě)自定義屬性、構(gòu)造方法、初始化Paint、Path、測(cè)量寬高。注意Path要兩個(gè),一個(gè)裝有原始數(shù)據(jù),一個(gè)去裝新截取的路徑數(shù)據(jù):
mPath = new Path(); mDst = new Path();
2、初始化PathMeasure,并設(shè)置路徑,獲得原始長(zhǎng)度:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mPath.addCircle(w / 2, h / 2, mRadius, Path.Direction.CW);
mPathMeasure = new PathMeasure();
mPathMeasure.setPath(mPath, false);
mPathLength = mPathMeasure.getLength();
}
因?yàn)榻omPathMeasure 設(shè)置的路徑必須要裝載數(shù)據(jù),所以此時(shí)mPath需要加上你想畫(huà)的東西,畫(huà)一個(gè)圓又要有寬高,onDraw中又不能new對(duì)象,所以我把這些操作放到了onSizeChanged中。
3、寫(xiě)一個(gè)動(dòng)畫(huà),獲取當(dāng)前長(zhǎng)度的百分比mPathPercent:
private void startAnim() {
ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
anim.setInterpolator(new DecelerateInterpolator());
anim.setRepeatCount(ValueAnimator.INFINITE);
anim.setDuration(mAnimDuration);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mPathPercent = (float) animation.getAnimatedValue();
invalidate();
}
});
anim.start();
//再加一個(gè)旋轉(zhuǎn)動(dòng)畫(huà)以及兩倍的時(shí)長(zhǎng),形成旋轉(zhuǎn)視差
ObjectAnimator animRotate = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
animRotate.setInterpolator(new LinearInterpolator());
animRotate.setRepeatCount(ValueAnimator.INFINITE);
animRotate.setDuration(2 * mAnimDuration);
animRotate.start();
}
4、動(dòng)態(tài)改變起止點(diǎn)長(zhǎng)度,截取新路徑并繪制:
@Override
protected void onDraw(Canvas canvas) {
float stop = mPathLength * mPathPercent;
float start = (float) (stop - ((0.5 - Math.abs(mPathPercent - 0.5)) * mPathLength * 4));
mDst.reset();
// mDst.lineTo(0, 0);
mPathMeasure.getSegment(start, stop, mDst, true);
canvas.drawPath(mDst, mPaint);
}
注意此時(shí)繪制的路徑是新路徑mDst,而不是裝有原始數(shù)據(jù)的老路徑mPath~
5、順便加幾個(gè)控制的方法:
public void start() {
mIsLoading = true;
setVisibility(View.VISIBLE);
startAnim();
}
public void stop() {
mIsLoading = false;
setVisibility(View.GONE);
}
public boolean isLoading() {
return mIsLoading;
}
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (loadingView.isLoading()) {
loadingView.stop();
} else {
loadingView.start();
}
}
});
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義谷歌風(fēng)格ProgressBar
- Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級(jí)、二級(jí)進(jìn)度條顏色)
- Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
- Android編程ProgressBar自定義樣式之動(dòng)畫(huà)模式實(shí)現(xiàn)方法
- android ListView和ProgressBar(進(jìn)度條控件)的使用方法
- Android ProgressBar進(jìn)度條和ProgressDialog進(jìn)度框的展示DEMO
- Android ProgressBar進(jìn)度條使用詳解
- Android編程之自定義ProgressBar示例
相關(guān)文章
Android仿QQ好友列表實(shí)現(xiàn)列表收縮與展開(kāi)
這篇文章主要介紹了Android仿QQ好友列表實(shí)現(xiàn)列表收縮與展開(kāi),感興趣的小伙伴們可以參考一下2015-12-12
android仿360加速球?qū)崿F(xiàn)內(nèi)存釋放
本篇文章實(shí)現(xiàn)了Android仿360加速球?qū)崿F(xiàn)內(nèi)存釋放,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
Android 用adb pull或push 拷貝手機(jī)文件到到電腦上,拷貝手機(jī)數(shù)據(jù)庫(kù)到電腦上,拷貝電腦數(shù)據(jù)庫(kù)到手機(jī)上
這篇文章主要介紹了Android 用adb pull或push 拷貝手機(jī)文件到到電腦上,拷貝手機(jī)數(shù)據(jù)庫(kù)到電腦上,拷貝電腦數(shù)據(jù)庫(kù)到手機(jī)上 的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android WiFi熱點(diǎn)開(kāi)發(fā)的示例代碼
這篇文章主要介紹了Android WiFi熱點(diǎn)開(kāi)發(fā)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Android四種數(shù)據(jù)存儲(chǔ)的應(yīng)用方式
這篇文章主要介紹了Android四種數(shù)據(jù)存儲(chǔ)的應(yīng)用方式的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握Android存儲(chǔ)數(shù)據(jù)的方法,需要的朋友可以參考下2017-10-10
Android自定義商品購(gòu)買(mǎi)數(shù)量加減控件
這篇文章主要為大家詳細(xì)介紹了Android自定義商品購(gòu)買(mǎi)數(shù)量加減控件的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android?Flutter制作一個(gè)修改組件屬性的動(dòng)畫(huà)
flutter為我們提供了一個(gè)AnimationController來(lái)對(duì)動(dòng)畫(huà)進(jìn)行詳盡的控制,不過(guò)直接是用AnimationController是比較復(fù)雜的,如果只是對(duì)一個(gè)widget的屬性進(jìn)行修改,可以做成動(dòng)畫(huà)嗎,本文就來(lái)探討一下2023-05-05
Android實(shí)現(xiàn)Service下載文件,Notification顯示下載進(jìn)度的示例
本篇文章主要介紹了Android實(shí)現(xiàn)Service下載文件,Notification顯示下載進(jìn)度,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Android實(shí)現(xiàn)動(dòng)態(tài)向Gallery中添加圖片及倒影與3D效果示例
這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)態(tài)向Gallery中添加圖片及倒影與3D效果的方法,涉及Android針對(duì)圖片的加載、顯示、翻轉(zhuǎn)、倒影等相關(guān)特效功能實(shí)現(xiàn)技巧2016-08-08
Android?8.0實(shí)現(xiàn)藍(lán)牙遙控器自動(dòng)配對(duì)
這篇文章主要為大家詳細(xì)介紹了Android?8.0實(shí)現(xiàn)藍(lán)牙遙控器自動(dòng)配對(duì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

