Android自定義View 使用PathMeasure簡單模仿系統(tǒng)ProgressBar(四)
使用PathMeasure簡單模仿系統(tǒng)ProgressBar,效果如下:
還蠻像的吧,有的人問了,系統(tǒng)自帶的你閑的搞這個(gè)干嘛,當(dāng)然是純粹為了學(xué)習(xí)PathMeasure這個(gè)類。
PathMeasure是用來測量Path路徑的,可以截取路徑中某一段路徑,通過改變這段路徑的起點(diǎn)、終點(diǎn),達(dá)到類似VectorDrawable中的路徑動(dòng)畫效果:
直接new就可以獲得PathMeasure對象:
PathMeasure pathMeasure = new PathMeasure();
或者
PathMeasure pathMeasure = new PathMeasure(path, forceClosed);
其中path代表一個(gè)Path對象,forceClosed代表你測量的path是否閉合,如果為true,那么測量長度的時(shí)候周長會按path.close()來算。
也可以調(diào)用以下方法設(shè)置路徑:
pathMeasure.setPath(path, forceClosed);
獲得路徑的長度:
float length = pathMeasure.getLength();
截取路徑,新截取到的賦值給一個(gè)新Path對象mDstPath
pathMeasure.getSegment(start, stop, mDstPath, true);
其中start和stop為起止長度,第四個(gè)參數(shù)代表是否startWithMoveTo,是否從moveTo位置開始,一般為true。
要實(shí)現(xiàn)上面的效果,那就用屬性動(dòng)畫寫一個(gè)0到1的百分比,根據(jù)當(dāng)前的百分比和原路徑的長度,動(dòng)態(tài)改變新路徑的起止點(diǎn)長度:
1、寫自定義屬性、構(gòu)造方法、初始化Paint、Path、測量寬高。注意Path要兩個(gè),一個(gè)裝有原始數(shù)據(jù),一個(gè)去裝新截取的路徑數(shù)據(jù):
mPath = new Path(); mDst = new Path();
2、初始化PathMeasure,并設(shè)置路徑,獲得原始長度:
@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需要加上你想畫的東西,畫一個(gè)圓又要有寬高,onDraw中又不能new對象,所以我把這些操作放到了onSizeChanged中。
3、寫一個(gè)動(dòng)畫,獲取當(dā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)畫以及兩倍的時(shí)長,形成旋轉(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)長度,截取新路徑并繪制:
@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(); } } });
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義谷歌風(fēng)格ProgressBar
- Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級、二級進(jìn)度條顏色)
- Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
- Android編程ProgressBar自定義樣式之動(dòng)畫模式實(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 Activity啟動(dòng)模式之singleTop實(shí)例詳解
這篇文章主要介紹了Android Activity啟動(dòng)模式之singleTop,結(jié)合實(shí)例形式較為詳細(xì)的分析了singleTop模式的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01Android getJSONObject與optJSONObject的區(qū)別結(jié)合源碼分析
這篇文章主要介紹了Android getJSONObject與optJSONObject的區(qū)別,結(jié)合源碼分析的相關(guān)資料,需要的朋友可以參考下2017-02-02Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動(dòng)回繞效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動(dòng)回繞效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android自定義ListView實(shí)現(xiàn)下拉刷新上拉加載更多
Listview現(xiàn)在用的很少了,基本都是使用Recycleview,但是不得不說Listview具有劃時(shí)代的意義,我們可以自己添加下拉刷新,上拉加載更多功能。本文就來利用自定義ListView實(shí)現(xiàn)下拉刷新上拉加載更多效果,需要的可以參考一下2022-10-10Android實(shí)現(xiàn)九宮格(GridView中各項(xiàng)平分空間)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)九宮格(GridView中各項(xiàng)平分空間)的方法,涉及Android針對GridView操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06Android ExpandableRecyclerView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android ExpandableRecyclerView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08