最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義view實(shí)現(xiàn)水波進(jìn)度條控件

 更新時(shí)間:2018年05月16日 10:28:58   作者:yhongm  
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)水波進(jìn)度條控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

通過(guò)自定義view實(shí)現(xiàn)了一個(gè)水滴滴落到水波面,濺起水花并且水波流動(dòng)上漲的進(jìn)度條控件。之前看到過(guò)好多水波流動(dòng)的進(jìn)度條,感覺(jué)欠缺些東西,就想到了水滴到水平面,濺起水花然后水流動(dòng)上漲的進(jìn)度條效果,于是自己動(dòng)手寫(xiě)了出來(lái)。效果如下,視頻錄制有些卡頓,實(shí)際會(huì)流暢很多。

demo

一.用法

1.布局文件中添加WaveProgressView,circleColor屬性為圓環(huán)顏色,waterColor屬性為水波水滴的顏色,progress屬性為初始的進(jìn)度

<com.yhongm.wave_progress_view.WaveProgressView
  android:id="@+id/wave_progress_view"
  android:layout_width="300dp"
  android:layout_height="300dp"
  android:layout_centerInParent="true"
  app:circleColor="#e38854"
  app:progress="0"
  app:waterColor="#5488e3" />

2.WaveProgressView.setProgress()方法設(shè)置當(dāng)前的進(jìn)度

二.本文實(shí)現(xiàn)的邏輯

1,畫(huà)水波流動(dòng),通過(guò)三階貝塞爾曲線(xiàn)畫(huà)波形,通過(guò)不斷的改變waveOffsetX和waveOffsetY的值實(shí)現(xiàn)流動(dòng)的效果

/**
   * 生成水波流動(dòng)
   *
   * @param begin    水波形開(kāi)始的位置
   * @param waveLength 水波的長(zhǎng)度
   * @param waveOffsetX 水波水平的偏移
   * @param waveOffsetY 水波垂直方向的偏移
   * @return
   */
  private Path getWavePath(float begin, int waveLength, int waveOffsetX, int waveOffsetY) {
    Path mPath = new Path();
    mPath.reset();
    mPath.moveTo(waveLength * begin, mCurrentHeight);
    for (int i = 0; i < mWaveCount; i++) {
      mPath.quadTo(waveLength * (begin + 0.25f) + (i * waveLength) + waveOffsetX, mCurrentHeight + waveOffsetY, (waveLength * (begin + 0.5f) + (i * waveLength) + waveOffsetX), mCurrentHeight);
      mPath.quadTo(waveLength * (begin + 0.75f) + (i * waveLength) + waveOffsetX, mCurrentHeight - waveOffsetY, (waveLength * (begin + 1f) + (i * waveLength) + waveOffsetX), mCurrentHeight);
    }
    mPath.lineTo(mWidth, mHeight);
    mPath.lineTo(0, mHeight);
    mPath.close();
    return mPath;
  } 

2.畫(huà)水滴的形狀,水滴的形狀是通過(guò)一個(gè)三角形和一個(gè)弧形組成的

/**
   * 水滴的Path
   *
   * @param x  水滴坐標(biāo)x
   * @param y  水滴坐標(biāo)y
   * @param size 水滴尺寸
   * @return
   */
  private Path waterDrop(float x, float y, int size) {
    Path mDropPath = new Path();
    mDropPath.moveTo(x - size, y);
    mDropPath.lineTo(x, (float) (y - size * 2.5));
    mDropPath.lineTo(x + size, y);
    mDropPath.addArc(x - size, y - size, x + size, y + size, 0, 180);
    return mDropPath;
  }

3.畫(huà)水滴滴落到水波的效果,就是沿軸Y軸不斷的移動(dòng)水滴

/**
   * 根據(jù)位置畫(huà)水滴
   *
   * @param x
   * @param y
   * @param canvas
   */
  private void drawDropByLocation(Canvas canvas, int x, int y) {
    Path mDropPath = waterDrop(x, y, 30);
    if (y == (mCurrentHeight + 50)) {
      mDropPaint.setAlpha(0);
    }
    canvas.drawPath(mDropPath, mDropPaint);
  }

4.畫(huà)最外兩側(cè)濺落的水滴,通過(guò)三階貝塞爾曲線(xiàn)模擬左右兩側(cè)水滴濺落的路徑,隨機(jī)生成的水滴濺落路徑都在這左右兩側(cè)內(nèi)

/**
   * 畫(huà)兩側(cè)水滴飛濺的效果,并且隨機(jī)生成水滴
   *
   * @param canvas
   * @param x
   * @param y   當(dāng)前高度
   */
  private synchronized void drawDropSplash(Canvas canvas, int x, int y) {
    PathMeasure mLeftPathMeasure = getOnBothSidesOfPathMeasure(x, y, true);
    PathMeasure mRightPathMeasure = getOnBothSidesOfPathMeasure(x, y, false);

    float[] mLeftPos = new float[2];
    float[] mRightPos = new float[2];
    float[] mLeftTan = new float[2];
    float[] mRightTan = new float[2];

    for (int i = 0; i < 200; i++) {
      float percent = i / 200f;
      mLeftPathMeasure.getPosTan(mLeftPathMeasure.getLength() * percent, mLeftPos, mLeftTan);
      mRightPathMeasure.getPosTan(mRightPathMeasure.getLength() * percent, mRightPos, mRightTan);
      mLeftHashMapPath.put(Math.round(mLeftPos[1]), mLeftPos[0]);
      mRightHashMapPath.put(Math.round(mRightPos[1]), mRightPos[0]);
    }

    if (mRandomHashMap.isEmpty() && mRandomHashMap.size() == 0) {
      pushRandomDrag(y);
    }
    drawRandomDrag(canvas, x, y, mLeftHashMapPath, mRightHashMapPath);

    drawOnBothSidesOfWaterDrop(canvas, mLeftPathMeasure);

    drawOnBothSidesOfWaterDrop(canvas, mRightPathMeasure);

}
/**
   * 產(chǎn)生隨機(jī)的水滴
   *
   * @param y
   */
  private void pushRandomDrag(int y) {
    Random r = new Random();
    for (int i = 0; i < 20; i++) {
      int randomY = r.nextInt(y);
      if (mLeftHashMapPath.containsKey(randomY)) {
        Float rightValue = mRightHashMapPath.get(randomY);
        Float leftValue = mLeftHashMapPath.get(randomY);
        int roundLeftValue = Math.round(leftValue);
        int roundRightValue = Math.round(rightValue);
        if (roundRightValue == roundLeftValue) {
          roundRightValue++;
        }
        int roundMinus = Math.round(roundRightValue - roundLeftValue);//左右差值
        float randomX = r.nextInt(roundMinus) + mLeftHashMapPath.get(randomY);//左右差值加上最小值,保證隨機(jī)值在兩者之間
        mRandomHashMap.put(randomX, randomY);

      }
    }
}

5.隨機(jī)生成的水滴沿著三階貝塞爾曲線(xiàn)移動(dòng),形成濺落的效果

/**
   * 畫(huà)隨機(jī)生成水滴濺起
   *
   * @param canvas
   * @param x
   * @param y
   * @param size
   * @param randomY
   * @param randomX
   */
  private void drawSmartDropOnPath(Canvas canvas, int x, int y, int size, int randomY, float randomX) {
    Path smartDropPath = new Path();
    smartDropPath.moveTo(x, y + 50);
    if (x < randomX) {
      smartDropPath.cubicTo(x, y + 50, randomX + 30, randomY - 20, randomX, randomY);
    } else {
      smartDropPath.cubicTo(x, y + 50, randomX - 30, randomY - 20, randomX, randomY);
    }
    smartDropPath.lineTo(randomX, randomY + 150);
    PathMeasure pathMeasure = new PathMeasure();
    pathMeasure.setPath(smartDropPath, false);
    float[] pos = new float[2];
    float[] tan = new float[2];
    pathMeasure.getPosTan(pathMeasure.getLength() * mPercent, pos, tan);
    Path path = waterDrop(pos[0], pos[1], size);
    canvas.drawPath(path, mSplashPaint);
  }

完整代碼詳見(jiàn) 點(diǎn)擊打開(kāi)Github本項(xiàng)目 感興趣的話(huà)幫我點(diǎn)個(gè)Star

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • android 默認(rèn)時(shí)間格式修改方法

    android 默認(rèn)時(shí)間格式修改方法

    在android使用中,遇到修改默認(rèn)時(shí)間格式時(shí),總是束手無(wú)策,本文將以此問(wèn)題提供解決方案,需要了解的朋友可以參考下
    2012-11-11
  • Android自定義字母導(dǎo)航欄

    Android自定義字母導(dǎo)航欄

    這篇文章主要為大家詳細(xì)介紹了Android自定義字母導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android內(nèi)存優(yōu)化操作方法梳理總結(jié)

    Android內(nèi)存優(yōu)化操作方法梳理總結(jié)

    這篇文章主要介紹了Android 內(nèi)存優(yōu)化知識(shí)點(diǎn)梳理總結(jié),Android 操作系統(tǒng)給每個(gè)進(jìn)程都會(huì)分配指定額度的內(nèi)存空間,App 使用內(nèi)存來(lái)進(jìn)行快速的文件訪(fǎng)問(wèn)交互,長(zhǎng)時(shí)間如此便需要優(yōu)化策略,文章分享優(yōu)化知識(shí)點(diǎn)總結(jié),需要的朋友可以參考一下
    2022-11-11
  • Android自定義view仿iOS彈出框效果

    Android自定義view仿iOS彈出框效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義view仿iOS彈出框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Android評(píng)分控件RatingBar使用實(shí)例解析

    Android評(píng)分控件RatingBar使用實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了Android評(píng)分控件RatingBar使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android應(yīng)用創(chuàng)建桌面快捷方式代碼

    Android應(yīng)用創(chuàng)建桌面快捷方式代碼

    這篇文章主要為大家詳細(xì)介紹了Android應(yīng)用創(chuàng)建桌面快捷方式代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • ListView通用泛型適配器

    ListView通用泛型適配器

    今天小編就為大家分享一篇關(guān)于ListView通用泛型適配器,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Android利用ViewPager實(shí)現(xiàn)滑動(dòng)廣告板實(shí)例源碼

    Android利用ViewPager實(shí)現(xiàn)滑動(dòng)廣告板實(shí)例源碼

    利用ViewPager我們可以做很多事情,從最簡(jiǎn)單的導(dǎo)航,到頁(yè)面切換菜單等等。ViewPager的功能就是可以使視圖滑動(dòng),就像Lanucher左右滑動(dòng)那樣
    2013-06-06
  • 簡(jiǎn)介Android 中的AsyncTask

    簡(jiǎn)介Android 中的AsyncTask

    AsyncTask是一個(gè)很常用的API,尤其異步處理數(shù)據(jù)并將數(shù)據(jù)應(yīng)用到視圖的操作場(chǎng)合。接下來(lái)通過(guò)本文給大家介紹Android 中的AsyncTask,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Android 中按home鍵和跳轉(zhuǎn)到主界面的實(shí)例代碼

    Android 中按home鍵和跳轉(zhuǎn)到主界面的實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家分享Android 中按home鍵和跳轉(zhuǎn)到主界面的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-04-04

最新評(píng)論

天峨县| 东丽区| 金阳县| 枝江市| 定襄县| 大港区| 长岛县| 中方县| 隆尧县| 彭阳县| 东至县| 乃东县| 垫江县| 东兰县| 花垣县| 紫金县| 山东省| 双桥区| 樟树市| 万源市| 镇远县| 韶山市| 兴隆县| 阿图什市| 旌德县| 怀仁县| 丰县| 伊吾县| 安义县| 阿克陶县| 闽清县| 北安市| 同江市| 临桂县| 江阴市| 浙江省| 靖安县| 辽中县| 洛阳市| 马龙县| 定襄县|