仿掌閱書城書架切換

首先我們先分析一下掌閱在書城書架的切換效果:

  • 首先書架判帮、書城兩個視圖都會移動袱饭,速度不同所以大概得出在擺放的時候會有一定的偏移雌桑。
  • 再有就是透明度汇跨、和移動位置隨著手指的滑動而變化务荆。
  • 書架視圖的右邊界有一個陰影來達到層疊的效果。

在模仿別人的視圖中穷遂,一般都會使用到系統(tǒng)的顯示布局邊界的功能函匕。

  • 在這個圖片中可以看到右邊有一條邊界線應(yīng)該是視圖的初始位置,可以證明第一個特點蚪黑,下層視圖有一定的偏移盅惜,大概的偏移量為屏幕的4/5中剩。所以在onLayout()就需要對布局重新排布一下。
DisplayMetrics dm = context.getResources().getDisplayMetrics();
widthPixels = dm.widthPixels;
// 用于計算被覆蓋的移動的距離抒寂,產(chǎn)生上下同時完成單速度不同的效果
firstLayoutOffset = (widthPixels / 5)*4;
getChildAt(0).layout(getChildAt(0).getLeft() + firstLayoutOffset,
                        0,getChildAt(0).getLeft() + getChildAt(0).getWidth()
                                + firstLayoutOffset,
                        getChildAt(0).getMeasuredHeight()); ```
- 重寫onTouchEvent()方法结啼,在MotionEvent.ACTION_MOVE:中計算X軸的偏移距離,從而根據(jù)偏移的大小來變化透明度和偏移量屈芜。通過X滑動大小和方向來進行變化郊愧。

private void doAnimation(int dx, boolean isMoveToLeft) {
isStartDrag = true;
// 計算移動中當(dāng)前透明度的值,通過變化因子和變化值計算
currentAlpha += (float) alphaForctor * dx;
// 計算當(dāng)前的偏移值
currentTranslate += translateFactor * dx;
// 防止超過透明度的開始值也為最大值
currentAlpha = currentAlpha < START_ALPHA ? currentAlpha : START_ALPHA;
if (currentAlpha <= 0) {
currentAlpha = 0;
}
if ((currentTranslate <= 0 && !isCollapse)
|| (currentTranslate >= 0 && isCollapse)) {
this.invalidate();
} else {
currentTranslate = START_TRANSLATE;
}
}

- 在MotionEvent.ACTION_UP:中根據(jù)當(dāng)前移動的偏移距離來判斷是取消動畫還是完成動畫井佑。

case MotionEvent.ACTION_UP:
if (x >= mFirstMotionX) {
isMoveToRight = true;
} else {
isMoveToRight = false;
}
lastAlpha = currentAlpha;
lastTranslate = currentTranslate;
if (isMoveToRight) {
if (x - mFirstMotionX > widthPixels * 0.5f) {
endAnimation();
} else {
cancelAnimation();
}
} else {
if (x + (widthPixels - mFirstMotionX) < widthPixels * 0.5f) {
endAnimation();
} else {
cancelAnimation();
}
}
break;

- 結(jié)束動畫属铁、和取消動畫。

private void endAnimation() {
//根據(jù)已經(jīng)完成的距離躬翁,來計算一下還需要多長時間來完成后續(xù)的動畫
int duration = (int) (((1 - Math.abs(currentTranslate)) * SCREEN_DIVID_BY) * averageDuration);
accelerantTween.start(duration);
}
private void cancelAnimation() {
this.isCancel = true;
accelerantTween.start(CANCEL_ANIMATION_TIME);
}

- AccelerantTween類:創(chuàng)建一個線程焦蘑,根據(jù)需要完成的時間,和每一幀的時間來進行事件的回調(diào)盒发,完成相應(yīng)的動作例嘱。

Runnable mTick = new Runnable() {

    public void run() {
        long baseTime = mBaseTime;
        long now = SystemClock.uptimeMillis();
        long diff = now - baseTime;
        int duration = mDuration;
        float val = diff / (float) duration;
        val = Math.max(Math.min(val, 1.0f), 0.0f);
        currentValue = val;
        if (!isPause) {
            if (diff >= duration) {
                mCallback.onTweenFinished(next);
                isLastFrame = true;
            }
            mCallback.onTweenValueChanged(currentValue, isLastFrame);
        } else {
            mCallback.onTweenStop();
        }
        int frame = (int) (diff / FRAME_TIME);
        next = baseTime + ((frame + 1) * FRAME_TIME);
        if (diff < duration && !isPause) {
            mHandler.postAtTime(this, next);
        }
        if (diff >= duration) {
            mRunning = false;
        }
    }
};
- 在根據(jù)計算出的偏移距離和透明度進行繪制。
- 大概邏輯詳細可以看源碼:https://github.com/zhaoyongchao/SlideSwitchScreen
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迹辐,一起剝皮案震驚了整個濱河市蝶防,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌明吩,老刑警劉巖间学,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異印荔,居然都是意外死亡低葫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門仍律,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘿悬,“玉大人,你說我怎么就攤上這事水泉∩普牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵草则,是天一觀的道長钢拧。 經(jīng)常有香客問我,道長炕横,這世上最難降的妖魔是什么源内? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮份殿,結(jié)果婚禮上膜钓,老公的妹妹穿的比我還像新娘嗽交。我一直安慰自己,他們只是感情好颂斜,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布夫壁。 她就那樣靜靜地躺著,像睡著了一般焚鲜。 火紅的嫁衣襯著肌膚如雪掌唾。 梳的紋絲不亂的頭發(fā)上放前,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天忿磅,我揣著相機與錄音,去河邊找鬼凭语。 笑死葱她,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的似扔。 我是一名探鬼主播吨些,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炒辉!你這毒婦竟也來了豪墅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黔寇,失蹤者是張志新(化名)和其女友劉穎偶器,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缝裤,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡屏轰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了憋飞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎苗。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榛做,靈堂內(nèi)的尸體忽然破棺而出唁盏,到底是詐尸還是另有隱情,我是刑警寧澤检眯,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布厘擂,位于F島的核電站,受9級特大地震影響轰传,放射性物質(zhì)發(fā)生泄漏驴党。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一获茬、第九天 我趴在偏房一處隱蔽的房頂上張望港庄。 院中可真熱鬧倔既,春花似錦、人聲如沸鹏氧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽把还。三九已至实蓬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吊履,已是汗流浹背安皱。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艇炎,地道東北人酌伊。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像缀踪,于是被迫代替她去往敵國和親居砖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗驴娃。 張土汪:刷leetcod...
    土汪閱讀 12,748評論 0 33
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程奏候,因...
    小菜c閱讀 6,444評論 0 17
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,710評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)唇敞,斷路器蔗草,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 我一直搞不清楚春天的雨是下在哪幾天,又是落到了哪些個地方去了厚棵,我問我家門前那棵反季而開的桂花樹蕉世,它說,春天的雨總是...
    租了五顆星閱讀 235評論 0 3