仿百度外賣水波紋

套路一:
  1. 無圖無真相
  1. 這里要感謝兩位大神的博客 參照很多

Android仿百度貼吧客戶端Loading小球
仿百度外賣的酷炫水波紋效果及解析

  1. 下面的4個小球完全參照 Android仿百度貼吧客戶端Loading小球 實現(xiàn) 有意向的同學可以點擊過去看看

#######套路二:

  1. 分析

頂部有水波紋不斷的浮動
頭像跟著水波紋的浮動而浮動

  1. 解決

于是馬上看源碼

@Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);

       canvas.setDrawFilter(mDrawFilter);

       mAbovePath.reset();
       mBelowWavePath.reset();

       φ-=0.1f;
       float y,y2;
       double ω = 2*Math.PI / getWidth();

       mAbovePath.moveTo(getLeft(),getBottom());
       mBelowWavePath.moveTo(getLeft(),getBottom());

       for (float x = 0; x <= getWidth(); x += 20) {
           /**
            *  y=Asin(ωx+φ)+k
            *  A—振幅越大发魄,波形在y軸上最大與最小值的差值越大
            *  ω—角速度, 控制正弦周期(單位角度內震動的次數(shù))
            *  φ—初相欢策,反映在坐標系上則為圖像的左右移動赏淌。這里通過不斷改變φ,達到波浪移動效果
            *  k—偏距,反映在坐標系上則為圖像的上移或下移六水。
            */
           y = (float) (8 * Math.cos(ω * x + φ) +8);
           y2 = (float) (8 * Math.sin(ω * x + φ));
           mAbovePath.lineTo(x, y);
           mBelowWavePath.lineTo(x, y2);
           //回調 把y坐標的值傳出去(在activity里面接收讓小機器人隨波浪一起搖擺)
           mWaveAnimationListener.OnWaveAnimation(y);
       }


       mAbovePath.lineTo(getRight(),getBottom());
       mBelowWavePath.lineTo(getRight(),getBottom());

       canvas.drawPath(mAbovePath,mAboveWavePaint);
       canvas.drawPath(mBelowWavePath,mBelowWavePaint);

       postInvalidateDelayed(20);
   }

What掷贾?ω φ 這些是什么意思啊 奈何這個大神內功太深厚 這一招一式打出來實在是參悟不透啊 估計再看下去會走火入魔,趕緊離開。
但是心有不甘,于是靜坐冥想1小時场靴。港准。。浅缸。

1.水波紋 不就是貝塞爾曲線嘛 用path.quadTo()能解決 再借鑒下Android仿百度貼吧客戶端Loading小球中的周期函數(shù)思想 讓水波紋不斷的浮動起來

2.圖片隨水波紋的浮動而浮動 圖片在x軸是固定不變得 只是在y軸有上下的波動 只要能獲取貝塞爾曲線中 path經(jīng)過與圖片x軸重合的y軸的坐標點就ok 剛好Android中有PathMeasure類結合Path 可以做到

想好這些 就開始擼碼

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Path fulPath = getActionFulPath(currentPercent);
        canvas.drawPath(fulPath,fulPaint);

        Path idmPath=getActionDimPath(currentPercent);
        canvas.drawPath(idmPath,dimPaint);
    }
 private Path getActionDimPath(float percent) {
        int quadWidth = width / 4;
        int quadHeight = height/3;

        Path path=new Path();
        int x=-width;
        x+=percent*width;
        path.moveTo(x,height/2);
        //第一段
        path.rQuadTo(quadWidth,-quadHeight,quadWidth*2,0);
        path.rQuadTo(quadWidth,quadHeight,quadWidth*2,0);
        //第二段
        path.rQuadTo(quadWidth,-quadHeight,quadWidth*2,0);
        path.rQuadTo(quadWidth,quadHeight,quadWidth*2,0);
        //閉合
        path.lineTo(x+width*2,height);
        path.lineTo(x,height);
        path.close();
        
        //關聯(lián)一個path
        measure.setPath(path,true);
        //獲取path到view中心的長度
        float length = Math.abs(x)+ (width / 2);
        //獲取該path該位置時的坐標值
        measure.getPosTan(length,pos,null);
       //將y坐標的值通過接口傳遞出去
       onWaveAnimationListener.onWaveAnimation(pos[1]+currentPercent);
       return path;
    }

注意這里是使用的path.rQuadTo() 是相對上次結束坐標來進行二次貝塞爾曲線的 不是相對于原點

上面的path差不多是這樣的(ps:實在不會用AI繪圖 若侵權了立馬刪除)


聲明傳遞數(shù)據(jù)的接口

public void setOnWaveAnimationListener(OnWaveAnimationListener listener){
        onWaveAnimationListener =listener;
    }
//接口
public  interface OnWaveAnimationListener{
    void  onWaveAnimation(float y);
    }

仔細看效果圖 有2個貝塞爾曲線 所以這個貝塞爾曲線與上面那個是相反的

 public Path getActionFulPath(float percent) {
        int quadWidth = width / 4;
        int quadHeight = height/3;

        Path path=new Path();
        int x=-width;
        x+=percent*width;
        path.moveTo(x,height/2);


        path.rQuadTo(quadWidth,quadHeight,quadWidth*2,0);
        path.rQuadTo(quadWidth,-quadHeight,quadWidth*2,0);

        path.rQuadTo(quadWidth,quadHeight,quadWidth*2,0);
        path.rQuadTo(quadWidth,-quadHeight,quadWidth*2,0);

        path.lineTo(x+width*2,height);
        path.lineTo(x,height);
        path.close();
        return path;
    }

在初始化的時候 啟動屬性動畫 讓水波紋浮動起來

    private void init() {
        fulPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        fulPaint.setColor(Color.parseColor("#fafafa"));
        fulPaint.setStyle(Paint.Style.FILL);

        dimPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        dimPaint.setColor(Color.parseColor("#fafafa"));
        dimPaint.setAlpha(80);
        dimPaint.setStyle(Paint.Style.FILL);

        //畫布抗鋸齒
        //mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        measure = new PathMeasure();

        ValueAnimator animator=ValueAnimator.ofFloat(0,1);
        animator.setDuration(3000);
        animator.setInterpolator(new LinearInterpolator());
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
            //不斷改變currentPercent的值 讓水波紋不斷的浮動起來
        currentPercent=animation.getAnimatedFraction();
                invalidate();
            }
        });
        animator.start();
    }

最后布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.sharemodule.LoadingActivity">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="#29a3fe">

        <com.example.sharemodule.widget.BaiduTopView
            android:id="@+id/waveView"
            android:layout_width="match_parent"
            android:layout_height="15dp"
            android:layout_gravity="bottom" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:text="百度外賣"
            android:textColor="@android:color/white"
            android:textSize="18sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/image"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="bottom|center_horizontal"
            android:scaleType="centerCrop" />
    </FrameLayout>

Activity中實現(xiàn)

public class LoadingActivity extends AppCompatActivity {
    private static final  String TAG= LoadingView.class.getSimpleName();
    @BindView(R.id.image)
    ImageView imageView;
    @BindView(R.id.waveView)
    BaiduTopView waveView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);
        ButterKnife.bind(this);
        Glide.with(this).load(R.drawable.head_gif).asGif().into(imageView);
    }
    @Override
    protected void onResume() {
        super.onResume();
        final FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams();
        waveView.setOnWaveAnimationListener(new BaiduTopView.OnWaveAnimationListener() {
            @Override
            public void onWaveAnimation(float y) {
                Log.e(TAG,"坐標:"+y);
                layoutParams.bottomMargin= (int)y;
                imageView.setLayoutParams(layoutParams);
            }
        });
    }
}

哎 先去找AI畫圖教程學習下 不然還有諸多不方便 如果有什么疑問的地方請隨時留言苟弛。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冀痕,更是在濱河造成了極大的恐慌,老刑警劉巖言蛇,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腊尚,死亡現(xiàn)場離奇詭異,居然都是意外死亡婿斥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門娇妓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈恰,“玉大人,你說我怎么就攤上這事着绷⌒吭疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵子漩,是天一觀的道長石洗。 經(jīng)常有香客問我,道長讲衫,這世上最難降的妖魔是什么孵班? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任篙程,我火速辦了婚禮别厘,結果婚禮上,老公的妹妹穿的比我還像新娘触趴。我一直安慰自己,他們只是感情好冗懦,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布披蕉。 她就那樣靜靜地躺著,像睡著了一般没讲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上困乒,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天贰谣,我揣著相機與錄音,去河邊找鬼百宇。 笑死秘豹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的既绕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼誓军,長吁一口氣:“原來是場噩夢啊……” “哼疲扎!你這毒婦竟也來了捷雕?” 一聲冷哼從身側響起壹甥,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浦译,沒想到半個月后溯职,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡渤弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年甚带,在試婚紗的時候發(fā)現(xiàn)自己被綠了佳头。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡碉输,死狀恐怖亭珍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情肄梨,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布侨赡,位于F島的核電站粱侣,受9級特大地震影響,放射性物質發(fā)生泄漏齐婴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一眨攘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共螺,春花似錦、人聲如沸藐不。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挑秉。三九已至苔货,卻和暖如春犀概,著一層夾襖步出監(jiān)牢的瞬間夜惭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工产喉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敢会,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓塞俱,卻偏偏與公主長得像互广,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惫皱,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,721評論 22 665
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫旅敷、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,059評論 4 62
  • 在銀行工作幾年柔纵,看見成堆的鈔票也已經(jīng)無感,因為明白那不會增加自己卡里一分錢的余額或详。看見各式各樣奇葩的人也已經(jīng)無感霸琴,...
    南方喬木閱讀 323評論 0 0
  • 把春天裝在心里 溫暖的話語如和風吹拂 把每一張臉都看成花朵 美麗的世界處處艷麗 寒冷是為了殺滅蚊蠅 炎熱是為了孕育...
    青崖白鹿A閱讀 656評論 14 11
  • 文/星姐 “老媽梧乘,快點庐杨,來打牌了选调!”剛剛洗漱完畢辑莫,小兒子就大聲的催我打牌了罩引。(游戲很簡單,主要是玩湊十袁铐,以此來培養(yǎng)...
    大腳寶貝閱讀 359評論 5 2