擼一個直播點贊動畫

最近在做直播相關(guān)的東西懂拾,這個動畫是IOS先擼出來的煤禽,后來android這邊要模仿,大部分直播應(yīng)用都有很炫酷的點贊動畫岖赋,所以也沒什么好稀奇的檬果。如果有現(xiàn)成的輪子了,就沒必要自己再造了,后來參照了程序亦非猿的實現(xiàn)选脊,做了些修改杭抠,最終效果還不錯。

live.gif

剛開始自己造輪子的時候也走了些彎路恳啥,最初是給這些圖標一些隨機的初始速度和偏移量然后慢慢上升偏灿,效果總是不大好,差了點意思钝的。后來仔細研究發(fā)現(xiàn)這些圖標上升的路線并不是直線翁垂,而是一個三階貝塞爾曲線。

  一階貝塞爾曲線硝桩,實際上就是一條連接兩點的直線段沿猜。
  二階貝塞爾曲線,就是兩點間的一條拋物線碗脊,利用一個控制點來控制拋物線的形狀啼肩。
  三階貝塞爾曲線,則需要一個起點衙伶,一個終點疟游,兩個控制點來控制曲線的形狀。

三節(jié)貝塞爾曲線的公式


公式.png

公式中:P0痕支,是我們的起點,P3是終點蛮原,P1卧须,P2是途徑的兩個點,而t則是一個因子,取值范圍是0-1儒陨。
整個曲線的生成過程


過程.gif

實現(xiàn)代碼如下花嘶,調(diào)用的時候只需要在構(gòu)造方法中傳入兩個隨機點即可。

    public class BesselEvaluator implements TypeEvaluator<float[]> {
        private float point1[] = new float[2], point2[] = new float[2];

        public BesselEvaluator(float[] point1, float[] point2) {
            this.point1 = point1;
            this.point2 = point2;
        }

        @Override
        public float[] evaluate(float fraction, float[] point0, float[] point3) {
            float[] currentPosition = new float[2];
            currentPosition[0] = point0[0] * (1 - fraction) * (1 - fraction) * (1 - fraction)
                    + point1[0] * 3 * fraction * (1 - fraction) * (1 - fraction)
                    + point2[0] * 3 * (1 - fraction) * fraction * fraction
                    + point3[0] * fraction * fraction * fraction;
            currentPosition[1] = point0[1] * (1 - fraction) * (1 - fraction) * (1 - fraction)
                    + point1[1] * 3 * fraction * (1 - fraction) * (1 - fraction)
                    + point2[1] * 3 * (1 - fraction) * fraction * fraction
                    + point3[1] * fraction * fraction * fraction;
            return currentPosition;
        }
    }

詳細的動畫實現(xiàn)可以參考一步一步教你實現(xiàn)Periscope點贊效果蹦漠,但很顯然我這里完成點贊動畫椭员,任務(wù)還沒有完成。有幾個問題需要解決:允許連續(xù)點贊笛园,而且是計數(shù)的隘击,什么時候把點贊的數(shù)量拋給服務(wù)器;我怎么看到其他用戶點贊研铆,或者其他用戶怎么看的到我點贊埋同。

先看第一個問題吧,什么時候把點贊數(shù)量拋給服務(wù)器棵红?由于產(chǎn)品經(jīng)理帶著小姨子跑路了凶赁,Ios和android兩個端的策略還不太一樣,但我們達成的基本共識就是:不能點一次拋一次,拋的次數(shù)越少越好虱肄。Ios是本地維護一個count致板,沒隔一段時間檢測count有增加,就拋一次咏窿。android這里是連續(xù)點擊的時間間隔大于一個約定值斟或,就認為本輪點贊結(jié)束,然后拋一次翰灾。以前有研究過單擊雙擊缕粹,這次連續(xù)點擊也來了,該來的總要來的纸淮。

public class MainActivity extends AppCompatActivity {

    long mLastTime = 0;
    long mCurTime = 0;
    private final int DELAY = 500;//連續(xù)點擊的臨界點
    BubbleView bubbleView;
    private int mClickCount = 0;
    private int currLikeCount;
    private TextView likeCount;
    private Timer delayTimer;
    private TimerTask timeTask;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            praiseRequest(mClickCount);
            delayTimer.cancel();
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        bubbleView=(BubbleView)findViewById(R.id.praise_anim);
        bubbleView.setDefaultDrawableList();
        likeCount = (TextView) findViewById(R.id.like_count);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                mCurTime = System.currentTimeMillis();
                if (mCurTime - mLastTime < DELAY) {
                    mClickCount++;
                } else {
                    mClickCount = 1;
                }
                currLikeCount++;
                likeCount.setText(String.valueOf(currLikeCount));
                delay();
                mLastTime = mCurTime;
                bubbleView.startAnimation(bubbleView.getWidth(), bubbleView.getHeight());
            }
        });
    }

    private void delay() {
        if (timeTask != null)
            timeTask.cancel();

        timeTask = new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                mHandler.sendMessage(message);
            }
        };
        delayTimer = new Timer();
        delayTimer.schedule(timeTask, DELAY);
    }

    /**
     * 點贊請求網(wǎng)絡(luò)
     */
    private void praiseRequest(int count) {

    }
}

第二個問題由于暫時沒條件做推送平斩,所以只能客戶端每隔一段時間輪一次接口了,如果相比較上次數(shù)量有增加咽块,動畫上就彈出相應(yīng)數(shù)量的愛心數(shù)绘面,這里就需要給屏幕上允許出現(xiàn)的愛心數(shù)量設(shè)置一個最大值,要不然一瞬間彈出幾百個甚至上千個肯定要悲劇了侈沪。


576DB36E-F179-47A0-A216-8C05381BCC94-1540-0000D86DB0CDA3D2.gif
test.gif

最后還是貼上代碼揭璃,需要的自取:GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭罪,一起剝皮案震驚了整個濱河市瘦馍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌应役,老刑警劉巖情组,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箩祥,居然都是意外死亡院崇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門袍祖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底瓣,“玉大人,你說我怎么就攤上這事蕉陋【杵荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵凳鬓,是天一觀的道長柑营。 經(jīng)常有香客問我,道長村视,這世上最難降的妖魔是什么官套? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上奶赔,老公的妹妹穿的比我還像新娘惋嚎。我一直安慰自己,他們只是感情好站刑,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布另伍。 她就那樣靜靜地躺著,像睡著了一般绞旅。 火紅的嫁衣襯著肌膚如雪摆尝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天因悲,我揣著相機與錄音堕汞,去河邊找鬼。 笑死晃琳,一個胖子當著我的面吹牛讯检,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卫旱,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼人灼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顾翼?” 一聲冷哼從身側(cè)響起投放,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎适贸,沒想到半個月后灸芳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡取逾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苹支。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾隅。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖债蜜,靈堂內(nèi)的尸體忽然破棺而出晴埂,到底是詐尸還是另有隱情,我是刑警寧澤寻定,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布儒洛,位于F島的核電站,受9級特大地震影響狼速,放射性物質(zhì)發(fā)生泄漏琅锻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恼蓬。 院中可真熱鬧惊完,春花似錦、人聲如沸处硬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荷辕。三九已至凿跳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疮方,已是汗流浹背控嗜。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留案站,地道東北人躬审。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蟆盐,于是被迫代替她去往敵國和親承边。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,126評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫石挂、插件博助、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 【一】 我不去想是否 能夠到達遠方 既然選擇了奔跑 便只顧迷茫前方 我不去比,誰快誰慢 找到自己舒心的速度 心跳隨...
    蕭竺閱讀 346評論 0 4
  • 這是我從接觸地理痹愚,喜歡地理富岳,到成為地理教師的成長九宮格。從初中喜歡了地理學科后拯腮,以后人生路上的每一個選擇都離不開地...
    廣南036謝倩閱讀 706評論 1 0
  • 人生應(yīng)該珍重的活過窖式。黑夜賜給我們未知和恐懼,白天賜給我們希望动壤。 白天是個假象萝喘,告訴我們一切都是永恒的。黑夜是現(xiàn)實主...
    青燈古閱讀 178評論 0 0