国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義View 使用PathMeasure簡單模仿系統ProgressBar(四)

2019-12-12 03:22:54
字體:
來源:轉載
供稿:網友

使用PathMeasure簡單模仿系統ProgressBar,效果如下:

這里寫圖片描述

還蠻像的吧,有的人問了,系統自帶的你閑的搞這個干嘛,當然是純粹為了學習PathMeasure這個類。

PathMeasure是用來測量Path路徑的,可以截取路徑中某一段路徑,通過改變這段路徑的起點、終點,達到類似VectorDrawable中的路徑動畫效果:

直接new就可以獲得PathMeasure對象:

PathMeasure pathMeasure = new PathMeasure();

或者

PathMeasure pathMeasure = new PathMeasure(path, forceClosed);

其中path代表一個Path對象,forceClosed代表你測量的path是否閉合,如果為true,那么測量長度的時候周長會按path.close()來算。

也可以調用以下方法設置路徑:

pathMeasure.setPath(path, forceClosed);

獲得路徑的長度:

float length = pathMeasure.getLength();

截取路徑,新截取到的賦值給一個新Path對象mDstPath

pathMeasure.getSegment(start, stop, mDstPath, true);

其中start和stop為起止長度,第四個參數代表是否startWithMoveTo,是否從moveTo位置開始,一般為true。

要實現上面的效果,那就用屬性動畫寫一個0到1的百分比,根據當前的百分比和原路徑的長度,動態改變新路徑的起止點長度:

1、寫自定義屬性、構造方法、初始化Paint、Path、測量寬高。注意Path要兩個,一個裝有原始數據,一個去裝新截取的路徑數據:

  mPath = new Path();  mDst = new Path();

2、初始化PathMeasure,并設置路徑,獲得原始長度:

@Overrideprotected 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();}

因為給mPathMeasure 設置的路徑必須要裝載數據,所以此時mPath需要加上你想畫的東西,畫一個圓又要有寬高,onDraw中又不能new對象,所以我把這些操作放到了onSizeChanged中。

3、寫一個動畫,獲取當前長度的百分比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(); //再加一個旋轉動畫以及兩倍的時長,形成旋轉視差 ObjectAnimator animRotate = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360); animRotate.setInterpolator(new LinearInterpolator()); animRotate.setRepeatCount(ValueAnimator.INFINITE); animRotate.setDuration(2 * mAnimDuration); animRotate.start();}

4、動態改變起止點長度,截取新路徑并繪制:

@Overrideprotected 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);}

注意此時繪制的路徑是新路徑mDst,而不是裝有原始數據的老路徑mPath~

5、順便加幾個控制的方法:

 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();  } }});

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五寨县| 潮安县| 米脂县| 元朗区| 定安县| 新巴尔虎左旗| 佛学| 东平县| 顺义区| 谷城县| 肃宁县| 军事| 浦江县| 抚州市| 雷州市| 大姚县| 彭州市| 桐庐县| 察哈| 隆林| 三穗县| 古浪县| 宣武区| 长岭县| 盐边县| 霍城县| 兴城市| 滁州市| 呼伦贝尔市| 怀柔区| 赞皇县| 丽江市| 富阳市| 新疆| 龙南县| 姜堰市| 云龙县| 镇康县| 安龙县| 铜川市| 石泉县|