使用Transition FrameWork實(shí)現(xiàn)有意義的轉(zhuǎn)場動(dòng)畫(譯)

原文

Android Transition Framework可以實(shí)現(xiàn)三種效果:

  1. 不同Activity之間切換時(shí),Activityc的內(nèi)容(contentView)轉(zhuǎn)場動(dòng)畫
  2. 不同Activity之間切換時(shí),如果使用了Shared Element動(dòng)畫,也可以使用Transition FrameWork來實(shí)現(xiàn)不同的過渡動(dòng)畫效果
  3. 同一個(gè)Activity內(nèi)View變化的過渡動(dòng)畫(Scene)

1. Activity之間切換的過渡動(dòng)畫

通過這種方法可以使activity切換時(shí)而咆,他們的布局內(nèi)容有過度動(dòng)畫

當(dāng)從Activity A切換到Activity B的時(shí)候,Activity布局的內(nèi)容會(huì)按照預(yù)先定義好的動(dòng)畫來執(zhí)行過渡動(dòng)畫擂红。在android.transition包中,已經(jīng)有三種現(xiàn)成的動(dòng)畫可以用:Explode围小,Slide和Fade篮条。所有這些過渡都會(huì)跟蹤activity布局中可見的目標(biāo)Views,驅(qū)動(dòng)這些Views按照過渡的規(guī)則產(chǎn)生響應(yīng)的動(dòng)畫效果吩抓。

Explode Slide Fade

你可以在xml中創(chuàng)建這些過渡效果,也可以通過代碼來創(chuàng)建赴恨。對(duì)于Fade過渡效果來說疹娶,它看起來是這樣子的:

xml中創(chuàng)建

過渡效果定義在xml中,目錄是res/transition

res/transition/activity_fade.xml

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/"
    android:duration="1000"/>

res/transition/activity_slide.xml

<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/"
    android:duration="1000"/>

要使用這些xml'中定義的過渡動(dòng)畫伦连,你需要使用TransitionInflater來實(shí)例化它們雨饺。

MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Slide slide = TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);
        getWindow().setExitTransition(slide);
    }

TransitionActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
        getWindow().setEnterTransition(fade);
    }

在代碼中創(chuàng)建

MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Slide slide = new Slide();
        slide.setDuration(1000);
        getWindow().setExitTransition(slide);
    }

TransitionActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = new Fade();
        fade.setDuration(1000);
        getWindow().setEnterTransition(fade);
    }

不管哪種創(chuàng)建方法都會(huì)產(chǎn)生如下的效果:

transition_fade
transition_fade

那么這里面一步一步的到底發(fā)生了什么:

  1. Activity A 啟動(dòng) Activity B

  2. Transition Framework 發(fā)現(xiàn) A 中定義了Exit Transition (slide) 然后就會(huì)對(duì)它的所有可見的View使用這個(gè)過渡動(dòng)畫.

  3. Transition Framework 發(fā)現(xiàn) B 中定義了Enter Transition (fade) 然后機(jī)會(huì)對(duì)它所有可見的Views使用這個(gè)過渡動(dòng)畫.

  4. On Back Pressed(按返回鍵) Transition Framework 會(huì)執(zhí)行把 Enter and Exit過渡動(dòng)畫反過來執(zhí)行(但是如果定義了 returnTransitionreenterTransition,那么就會(huì)執(zhí)行這些定義的動(dòng)畫)

譯注:

  • Exit Transition:可以理解為activity進(jìn)入后臺(tái)的過渡動(dòng)畫
  • Enter Transition:可以理解為創(chuàng)建activity并顯示時(shí)的過渡動(dòng)畫
  • Return Transition:可以理解為銷毀activity時(shí)的過渡動(dòng)畫
  • Reenter Transition:可以理解為activity從后臺(tái)進(jìn)入前臺(tái)時(shí)的過渡動(dòng)畫
  • 要使這些過渡動(dòng)畫生效,我們需要調(diào)用startActivity(intent惑淳,bundle)方法來啟動(dòng)activity额港。bundle需要通過ActivityOptionsCompat.makeSceneTransitionAnimation().toBundle()的方式來生成

ReturnTransition & ReenterTransition

Return and Reenter Transitions是與進(jìn)入和退出動(dòng)畫相對(duì)應(yīng)的.

  • EnterTransition <--> ReturnTransition
  • ExitTransition <--> ReenterTransition

如果Return or Reenter沒有創(chuàng)建, Android 會(huì)把Enter and Exit Transitions反過來執(zhí)行. 但是如果你創(chuàng)建了Return or Reenter,那Android就會(huì)執(zhí)行你創(chuàng)建的動(dòng)畫歧焦,并且這些動(dòng)畫可以不同.

b back a
b back a

我們可以修改下前面Fade的例子移斩,給 TransitionActivity創(chuàng)建 ReturnTransition。這里我們就拿Slide過渡效果來舉例子。這樣向瓷,如果我們從B返回到A的時(shí)候肠套,B就會(huì)執(zhí)行一個(gè)Slide的過渡效果。

TransitionActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = new Fade();
        fade.setDuration(1000);
        getWindow().setEnterTransition(fade);
        
        Slide slide = new Slide();
        slide.setDuration(1000);
        getWindow().setReturnTransition(slide);        
    }

可以看到猖任,如果沒有創(chuàng)建Return Transition你稚,退出的時(shí)候會(huì)執(zhí)行Enter Transtion相反的動(dòng)畫。如果創(chuàng)建了Return Transition朱躺,那么就會(huì)執(zhí)行這個(gè)創(chuàng)建的動(dòng)畫效果刁赖。

沒有Return Transition 有Return Transition
Enter: Fade In Enter: Fade In
Exit: Fade Out Exit: Slide out
transition_fade
transition_fade
transition_fade2
transition_fade2

2. Activity之間共享元素(Share Elements)

這里的思想就是通過動(dòng)畫的形式將兩個(gè)不同布局中的兩個(gè)不同的View聯(lián)系起來。
然后Transition framework就會(huì)在用戶從一個(gè)View切換到另一個(gè)View的時(shí)候給用戶展現(xiàn)一些必要的動(dòng)畫长搀。
但你要記住:發(fā)生動(dòng)畫的View并不是從一個(gè)布局中移動(dòng)到另一個(gè)布局宇弛。他們是兩個(gè)獨(dú)立的View。

A Start B with shared
A Start B with shared

a) 設(shè)置Window Content Transition屬性

你需要在app的 styles.xml中進(jìn)行設(shè)置.[譯]我沒有設(shè)置也沒問題

values/styles.xml

<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:windowContentTransitions">true</item
    ...
</style>

如果你愿意的話盈滴,你也可以給整個(gè)app設(shè)置一個(gè)默認(rèn)的轉(zhuǎn)場動(dòng)畫和共享元素動(dòng)畫涯肩。

<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar">
    ...
    <!-- specify enter and exit transitions -->
    <item name="android:windowEnterTransition">@transition/explode</item>
    <item name="android:windowExitTransition">@transition/explode</item>

    <!-- specify shared element transitions -->
    <item name="android:windowSharedElementEnterTransition">@transition/changebounds</item>
    <item name="android:windowSharedElementExitTransition">@transition/changebounds</item>
    ...
</style>

b)設(shè)置相同的transition name

為了使共享元素動(dòng)畫生效,你需要給共享元素的兩個(gè)View設(shè)置相同的android:transitionName屬性值巢钓。不過他們的id和其他屬性可以不同病苗。

layout/activity_a.xml

<ImageView
        android:id="@+id/small_blue_icon"
        style="@style/MaterialAnimations.Icon.Small"
        android:src="@drawable/circle"
        android:transitionName="@string/blue_name" />

layout/activity_b.xml

<ImageView
        android:id="@+id/big_blue_icon"
        style="@style/MaterialAnimations.Icon.Big"
        android:src="@drawable/circle"
        android:transitionName="@string/blue_name" />

c) 用共享元素來啟動(dòng)activity

使用ActivityOptions.makeSceneTransitionAnimation() 方法指定要共享元素的View和android:transitionName屬性的值

MainActivity.java


blueIconImageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, SharedElementActivity.class);

        View sharedView = blueIconImageView;
        String transitionName = getString(R.string.blue_name);

        ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, sharedView, transitionName);
        startActivity(i, transitionActivityOptions.toBundle());
    }
});

這樣就可以有下面漂亮的過渡效果了:

a to b with shared element
a to b with shared element

可以看到, Transition framework 創(chuàng)建并執(zhí)行了一個(gè)動(dòng)畫。動(dòng)畫的視覺效果就是一個(gè)View從一個(gè)activity移動(dòng)到另一個(gè)activity中并伴隨著形狀的變化症汹。

在fragment之間實(shí)現(xiàn)Shared elements過渡動(dòng)畫

這個(gè)activity中的做法幾乎是一樣的硫朦。

a)b)完全一樣, 只有c)有點(diǎn)區(qū)別

a) 設(shè)置Window Content Transition屬性

values/styles.xml

<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:windowContentTransitions">true</item>
    ...
</style>

b) 設(shè)置相同的transition name

layout/fragment_a.xml

<ImageView
        android:id="@+id/small_blue_icon"
        style="@style/MaterialAnimations.Icon.Small"
        android:src="@drawable/circle"
        android:transitionName="@string/blue_name" />

layout/fragment_b.xml

<ImageView
        android:id="@+id/big_blue_icon"
        style="@style/MaterialAnimations.Icon.Big"
        android:src="@drawable/circle"
        android:transitionName="@string/blue_name" />

c) 啟動(dòng)帶有共享元素的fragment

在你使用FragmentTransaction啟動(dòng)fragment的時(shí)候背镇,你需要同時(shí)帶上共享元素過渡動(dòng)畫的先關(guān)信息咬展。

FragmentB fragmentB = FragmentB.newInstance(sample);

// Defines enter transition for all fragment views
Slide slideTransition = new Slide(Gravity.RIGHT);
slideTransition.setDuration(1000);
sharedElementFragment2.setEnterTransition(slideTransition);

// Defines enter transition only for shared element
ChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);
fragmentB.setSharedElementEnterTransition(changeBoundsTransition);

getFragmentManager().beginTransaction()
        .replace(R.id.content, fragmentB)
        .addSharedElement(blueView, getString(R.string.blue_name))
        .commit();

最終的效果就是這樣的:

shared_element_no_overlap
shared_element_no_overlap

允許過渡效果之間的重疊

You can define if enter and exit transitions can overlap each other.
你可以設(shè)置一個(gè)activity的退出效果和另一個(gè)activity的進(jìn)入效果產(chǎn)生重疊部分。

Android文檔這么說的:

當(dāng)設(shè)置為true,enter transition會(huì)立馬執(zhí)行>
當(dāng)設(shè)置為false,enter transition會(huì)等到退出exit transition結(jié)束后再執(zhí)行.

這對(duì)Fragments和Activities的共享元素過渡效果都是有用的瞒斩。

FragmentB fragmentB = FragmentB.newInstance(sample);

// Defines enter transition for all fragment views
Slide slideTransition = new Slide(Gravity.RIGHT);
slideTransition.setDuration(1000);
sharedElementFragment2.setEnterTransition(slideTransition);

// Defines enter transition only for shared element
ChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);
fragmentB.setSharedElementEnterTransition(changeBoundsTransition);

// Prevent transitions for overlapping
fragmentB.setAllowEnterTransitionOverlap(overlap);
fragmentB.setAllowReturnTransitionOverlap(overlap);

getFragmentManager().beginTransaction()
        .replace(R.id.content, fragmentB)
        .addSharedElement(blueView, getString(R.string.blue_name))
        .commit();

可以看到破婆,效果還是挺明顯的:

Overlap True Overlap False
Fragment_2 出現(xiàn)在Fragment_1的上面 Fragment_2 等到Fragment_1消失后才出現(xiàn)
shared_element_overlap
shared_element_overlap
shared_element_no_overlap
shared_element_no_overlap

3. 布局元素動(dòng)畫

Scenes

也可以用來驅(qū)動(dòng)一個(gè)activity中的布局發(fā)生變化時(shí),讓其中的View產(chǎn)生過渡動(dòng)畫胸囱。

過渡效果發(fā)生在場景之間祷舀。場景就是一個(gè)定義了靜態(tài)UI的普通布局。Transition Framework可以在兩個(gè)場景之間添加切換過渡動(dòng)畫烹笔。

scene1 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene1, this);
scene2 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene2, this);
scene3 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene3, this);
scene4 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene4, this);

(...)

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button1:
            TransitionManager.go(scene1, new ChangeBounds());
            break;
        case R.id.button2:
            TransitionManager.go(scene2, TransitionInflater.from(this).inflateTransition(R.transition.slide_and_changebounds));
            break;
        case R.id.button3:
            TransitionManager.go(scene3, TransitionInflater.from(this).inflateTransition(R.transition.slide_and_changebounds_sequential));
            break;
        case R.id.button4:
            TransitionManager.go(scene4, TransitionInflater.from(this).inflateTransition(R.transition.slide_and_changebounds_sequential_with_interpolators));
            break;  
    }
}

上面的代碼會(huì)在同一個(gè)activity中的4個(gè)場景切換時(shí)產(chǎn)生過渡動(dòng)畫裳扯。每一次切花的動(dòng)畫都是不一樣的。

Transition Framework會(huì)考慮當(dāng)前場景內(nèi)所有可見的View并計(jì)算需出需要的動(dòng)畫來安排兩個(gè)場景之間的view的位置谤职。

scenes_anim
scenes_anim

布局的改變

也可以用來給布局屬性的變化加上過渡效果饰豺。你只需要做你想要的改變?nèi)缓笃渌木徒唤oTransition Framework,它會(huì)為你添加動(dòng)畫允蜈。

a) 開啟演示過渡效果

下面這行代碼告訴framework我們將要對(duì)UI進(jìn)行一些改變冤吨,請(qǐng)你給我加上過渡效果蒿柳。

TransitionManager.beginDelayedTransition(sceneRoot);

b) 改變布局參數(shù)

ViewGroup.LayoutParams params = greenIconView.getLayoutParams();
params.width = 200;
greenIconView.setLayoutParams(params);

改變View的寬度屬性讓他變小,這會(huì)觸發(fā)layoutMeasure锅很。這個(gè)點(diǎn)上其馏,Transition framework會(huì)記錄開始和結(jié)束時(shí)的相關(guān)值,并給這個(gè)變化加上過渡效果爆安。

view layout animation
view layout animation

4. (彩蛋) 共享元素(share elements)+圓形展現(xiàn)(Circular Reveal)

圓形展現(xiàn)僅僅一個(gè)現(xiàn)實(shí)和隱藏一組view的動(dòng)畫而已叛复。API21+可以通過ViewAnimationUtils來使用它。

Circular Reveal動(dòng)畫可以結(jié)合共享元素過渡效果來創(chuàng)建一些有意義的動(dòng)畫來告訴用戶app在發(fā)生中什么扔仓。

reveal_shared_anim
reveal_shared_anim

這又是怎么回事呢:

  • 橙色的圓是發(fā)生在MainActivityRevealActivity之間的共享元素動(dòng)畫褐奥。
  • RevealActivity中有一個(gè)共享元素動(dòng)畫結(jié)束的監(jiān)聽器。當(dāng)動(dòng)畫結(jié)束時(shí)它做了兩件事:
    • 給Toolbar執(zhí)行一個(gè)Circular Reveal動(dòng)畫
    • 使用ViewPropertyAnimatorRevealActivity的其他View執(zhí)行一個(gè)放大的動(dòng)畫

監(jiān)聽共享元素動(dòng)畫的結(jié)束

Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.changebounds_with_arcmotion);
getWindow().setSharedElementEnterTransition(transition);
transition.addListener(new Transition.TransitionListener() {
    @Override
    public void onTransitionEnd(Transition transition) {
        animateRevealShow(toolbar);
        animateButtonsIn();
    }
    
    (...)

});
        

顯示Toolbar

private void animateRevealShow(View viewRoot) {
    int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2;
    int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2;
    int finalRadius = Math.max(viewRoot.getWidth(), viewRoot.getHeight());

    Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, cx, cy, 0, finalRadius);
    viewRoot.setVisibility(View.VISIBLE);
    anim.setDuration(1000);
    anim.setInterpolator(new AccelerateInterpolator());
    anim.start();
}

放大activity的內(nèi)部view

private void animateButtonsIn() {
    for (int i = 0; i < bgViewGroup.getChildCount(); i++) {
        View child = bgViewGroup.getChildAt(i);
        child.animate()
                .setStartDelay(100 + i * DELAY)
                .setInterpolator(interpolator)
                .alpha(1)
                .scaleX(1)
                .scaleY(1);
    }
}

更多circular reveal動(dòng)畫

有很多種方式來實(shí)現(xiàn)一個(gè)view的顯示動(dòng)畫翘簇,但重要的是要讓這些動(dòng)畫有意義撬码,它可以告訴用戶app中正在發(fā)生著什么。

從目標(biāo)View的中間產(chǎn)生一個(gè)Circular Reveal動(dòng)畫

reveal_green
reveal_green
int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2;
int cy = viewRoot.getTop();
int finalRadius = Math.max(viewRoot.getWidth(), viewRoot.getHeight());

Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, cx, cy, 0, finalRadius);
viewRoot.setBackgroundColor(color);
anim.start();

從目標(biāo)View的頂部產(chǎn)生一個(gè)Circular Reveal動(dòng)畫并且結(jié)合了其他的動(dòng)畫

reveal_blue
reveal_blue
int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2;
int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2;
int finalRadius = Math.max(viewRoot.getWidth(), viewRoot.getHeight());

Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, cx, cy, 0, finalRadius);
viewRoot.setBackgroundColor(color);
anim.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        animateButtonsIn();
    }
});
anim.start();

從觸摸點(diǎn)產(chǎn)生一個(gè)Circular Reveal動(dòng)畫

reveal_yellow
reveal_yellow
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        if (view.getId() == R.id.square_yellow) {
            revealFromCoordinates(motionEvent.getRawX(), motionEvent.getRawY());
        }
    }
    return false;
}
private Animator animateRevealColorFromCoordinates(int x, int y) {
    float finalRadius = (float) Math.hypot(viewRoot.getWidth(), viewRoot.getHeight());

    Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, x, y, 0, finalRadius);
    viewRoot.setBackgroundColor(color);
    anim.start();
}

動(dòng)畫和展現(xiàn)

reveal_red
reveal_red
Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.changebounds_with_arcmotion);
transition.addListener(new Transition.TransitionListener() {
    @Override
    public void onTransitionEnd(Transition transition) {
        animateRevealColor(bgViewGroup, R.color.red);
    }
    (...)
   
});
TransitionManager.beginDelayedTransition(bgViewGroup, transition);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
btnRed.setLayoutParams(layoutParams);

Sample source code

https://github.com/lgvalle/Material-Animations

More information

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末版保,一起剝皮案震驚了整個(gè)濱河市呜笑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彻犁,老刑警劉巖叫胁,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汞幢,居然都是意外死亡驼鹅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門森篷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來输钩,“玉大人,你說我怎么就攤上這事仲智÷蚰耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵钓辆,是天一觀的道長为牍。 經(jīng)常有香客問我,道長岩馍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任抖韩,我火速辦了婚禮蛀恩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茂浮。我一直安慰自己双谆,他們只是感情好壳咕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顽馋,像睡著了一般谓厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸谜,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天竟稳,我揣著相機(jī)與錄音,去河邊找鬼熊痴。 笑死他爸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的果善。 我是一名探鬼主播诊笤,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼巾陕!你這毒婦竟也來了讨跟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤鄙煤,失蹤者是張志新(化名)和其女友劉穎晾匠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馆类,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡混聊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乾巧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句喜。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沟于,靈堂內(nèi)的尸體忽然破棺而出咳胃,到底是詐尸還是另有隱情,我是刑警寧澤旷太,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布展懈,位于F島的核電站,受9級(jí)特大地震影響供璧,放射性物質(zhì)發(fā)生泄漏存崖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一睡毒、第九天 我趴在偏房一處隱蔽的房頂上張望来惧。 院中可真熱鬧,春花似錦演顾、人聲如沸供搀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葛虐。三九已至胎源,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿脐,已是汗流浹背涕蚤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摄悯,地道東北人赞季。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像奢驯,于是被迫代替她去往敵國和親申钩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 假設(shè)瘪阁,兩個(gè)有Activity A和B A啟動(dòng)B: A發(fā)生exit動(dòng)畫撒遣,B發(fā)生enter動(dòng)畫 B返回A:B發(fā)生ret...
    i冰點(diǎn)閱讀 17,222評(píng)論 7 42
  • 轉(zhuǎn)載自:Android開發(fā)技術(shù)前線 ( android-tech-frontier ) 開始使用 Transiti...
    談小龍閱讀 2,053評(píng)論 0 7
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件管跺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評(píng)論 4 62
  • 我們睡覺起來然后我爸爸接著我們?nèi)ド痰炅恕?于是的商店玩兒了一天玩什么呢玩我的玩具义黎。于是我晚上回到家的時(shí)候發(fā)現(xiàn)連星皓...
    10小石頭相昊辰閱讀 304評(píng)論 0 2