MaterialDesign系列文章(十七)Behavior的相關(guān)問(wèn)題

不怕跌倒,所以飛翔

參考文獻(xiàn):(感謝作者的開(kāi)源精神)
嚴(yán)振杰的博客
希小風(fēng)的博客

1.Behavior介紹

Behavior是Android新出的Design庫(kù)里新增的布局概念。Behavior只有是CoordinatorLayout的直接子View才有意義。可以為任何View添加一個(gè)Behavior。
Behavior是一系列回調(diào)。讓你有機(jī)會(huì)以非侵入的為View添加動(dòng)態(tài)的依賴(lài)布局,和處理父布局(CoordinatorLayout)滑動(dòng)手勢(shì)的機(jī)會(huì)。如果我們想實(shí)現(xiàn)控件之間任意的交互效果,完全可以通過(guò)自定義 Behavior 的方式達(dá)到。

Behavior官方提供的app:layout_behavior屬性

關(guān)于這個(gè)我仔細(xì)找了一下就找到了兩個(gè)

  • appbar_scrolling_view_behavior 這個(gè)是appBarLayout的一個(gè)子類(lèi)android.support.design.widget.AppBarLayout$ScrollingViewBehavior中提供的
  • bottom_sheet_behavior 這個(gè)是單獨(dú)的一個(gè)類(lèi)中實(shí)現(xiàn)的android.support.design.widget.BottomSheetBehavior

這里說(shuō)明了兩個(gè)問(wèn)題:

  • 第一這個(gè)字符串設(shè)置的值應(yīng)該是類(lèi)的全路徑名稱(chēng)
  • 第二這個(gè)類(lèi)可以自定義(但是自定義的時(shí)候應(yīng)該也指定全路徑名稱(chēng))

2.Behavior的自定義

這里我準(zhǔn)備按照希小風(fēng)的博客風(fēng)格去逐步實(shí)

其實(shí)Behavior就是一個(gè)應(yīng)用于View的觀察者模式,一個(gè)View跟隨著另一個(gè)View的變化而變化,或者說(shuō)一個(gè)View監(jiān)聽(tīng)另一個(gè)View,在Behavior中,被觀察View也就是事件源被稱(chēng)為denpendcy,而觀察View被成為child

這里先貼出繼承繼承CoordinatorLayout.Behavior<V extends View>常用的方法

 /**
     * 表示是否給應(yīng)用了Behavior 的View 指定一個(gè)依賴(lài)的布局,通常,當(dāng)依賴(lài)的View 布局發(fā)生變化時(shí)
     * 不管被被依賴(lài)View 的順序怎樣,被依賴(lài)的View也會(huì)重新布局
     * @param parent
     * @param child 綁定behavior 的View
     * @param dependency   依賴(lài)的view
     * @return 如果child 是依賴(lài)的指定的View 返回true,否則返回false
     */
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return super.layoutDependsOn(parent, child, dependency);
    }

    /**
     * 當(dāng)被依賴(lài)的View 狀態(tài)(如:位置、大小)發(fā)生變化時(shí),這個(gè)方法被調(diào)用
     * @param parent
     * @param child
     * @param dependency
     * @return
     */
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        return super.onDependentViewChanged(parent, child, dependency);
    }

    /**
     *  當(dāng)coordinatorLayout 的子View試圖開(kāi)始嵌套滑動(dòng)的時(shí)候被調(diào)用。當(dāng)返回值為true的時(shí)候表明
     *  coordinatorLayout 充當(dāng)nested scroll parent 處理這次滑動(dòng),需要注意的是只有當(dāng)返回值為true
     *  的時(shí)候,Behavior 才能收到后面的一些nested scroll 事件回調(diào)(如:onNestedPreScroll、onNestedScroll等)
     *  這個(gè)方法有個(gè)重要的參數(shù)nestedScrollAxes,表明處理的滑動(dòng)的方向。
     *
     * @param coordinatorLayout 和Behavior 綁定的View的父CoordinatorLayout
     * @param child  和Behavior 綁定的View
     * @param directTargetChild
     * @param target
     * @param nestedScrollAxes 嵌套滑動(dòng) 應(yīng)用的滑動(dòng)方向,看 {@link ViewCompat#SCROLL_AXIS_HORIZONTAL},
     *                         {@link ViewCompat#SCROLL_AXIS_VERTICAL}
     * @return
     */
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    /**
     * 嵌套滾動(dòng)發(fā)生之前被調(diào)用
     * 在nested scroll child 消費(fèi)掉自己的滾動(dòng)距離之前,嵌套滾動(dòng)每次被nested scroll child
     * 更新都會(huì)調(diào)用onNestedPreScroll。注意有個(gè)重要的參數(shù)consumed,可以修改這個(gè)數(shù)組表示你消費(fèi)
     * 了多少距離。假設(shè)用戶(hù)滑動(dòng)了100px,child 做了90px 的位移,你需要把 consumed[1]的值改成90,
     * 這樣coordinatorLayout就能知道只處理剩下的10px的滾動(dòng)。
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param dx  用戶(hù)水平方向的滾動(dòng)距離
     * @param dy  用戶(hù)豎直方向的滾動(dòng)距離
     * @param consumed
     */
    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
    }

    /**
     * 進(jìn)行嵌套滾動(dòng)時(shí)被調(diào)用
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param dxConsumed target 已經(jīng)消費(fèi)的x方向的距離
     * @param dyConsumed target 已經(jīng)消費(fèi)的y方向的距離
     * @param dxUnconsumed x 方向剩下的滾動(dòng)距離
     * @param dyUnconsumed y 方向剩下的滾動(dòng)距離
     */
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    }

    /**
     *  嵌套滾動(dòng)結(jié)束時(shí)被調(diào)用,這是一個(gè)清除滾動(dòng)狀態(tài)等的好時(shí)機(jī)。
     * @param coordinatorLayout
     * @param child
     * @param target
     */
    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) {
        super.onStopNestedScroll(coordinatorLayout, child, target);
    }

    /**
     * onStartNestedScroll返回true才會(huì)觸發(fā)這個(gè)方法,接受滾動(dòng)處理后回調(diào),可以在這個(gè)
     * 方法里做一些準(zhǔn)備工作,如一些狀態(tài)的重置等。
     * @param coordinatorLayout
     * @param child
     * @param directTargetChild
     * @param target
     * @param nestedScrollAxes
     */
    @Override
    public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        super.onNestedScrollAccepted(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    /**
     * 用戶(hù)松開(kāi)手指并且會(huì)發(fā)生慣性動(dòng)作之前調(diào)用,參數(shù)提供了速度信息,可以根據(jù)這些速度信息
     * 決定最終狀態(tài),比如滾動(dòng)Header,是讓Header處于展開(kāi)狀態(tài)還是折疊狀態(tài)。返回true 表
     * 示消費(fèi)了fling.
     *
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param velocityX x 方向的速度
     * @param velocityY y 方向的速度
     * @return
     */
    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
        return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }

    //可以重寫(xiě)這個(gè)方法對(duì)子View 進(jìn)行重新布局
    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) {
        return super.onLayoutChild(parent, child, layoutDirection);
    }

2.1Button與TextView聯(lián)動(dòng)

這里主要是自定義了一個(gè)Behavior

/**
 * 作者 : 賀金龍
 * 創(chuàng)建時(shí)間 :  2017/11/8 11:33
 * 類(lèi)描述 : 這個(gè)是第一個(gè)簡(jiǎn)單的自定義EasyBehavior
 * 類(lèi)說(shuō)明 : 這里的泛型應(yīng)給是被觀察者,也就是child
 */
public class EasyBehavior extends CoordinatorLayout.Behavior<TextView> {
   
    public EasyBehavior(Context context, AttributeSet attrs) {
        /*這里說(shuō)明一下這個(gè)構(gòu)造方法一定要些上,否則會(huì)報(bào)錯(cuò)的*/
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency) {
        /*這里主要是說(shuō)明觀察者是什么類(lèi)型的,如果返回true說(shuō)明是觀察者觀察的View否則返回false也就不會(huì)產(chǎn)生聯(lián)動(dòng)了*/
        return dependency instanceof Button;
    }


    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency) {
        /*這里主要是觀察者位置改變的時(shí)候,被觀察者的位置在觀察者位置的基礎(chǔ)上響應(yīng)的增加了200*/
        child.setX(dependency.getX() + 200);
        child.setY(dependency.getY() + 200);
        child.setText(dependency.getX() + "," + dependency.getY());
        return true;
    }
}

注釋已經(jīng)寫(xiě)的很詳細(xì)了,所以這里就不在贅述了...

2.2仿UC首頁(yè)折疊的Behavior效果

這個(gè)效果可以下載一個(gè)UC去看一下,其實(shí)這個(gè)效果基本上就是頂上放一個(gè)TextView和AppBarLayout中底部ToolBar進(jìn)行
聯(lián)動(dòng)(其實(shí)我覺(jué)得就是通過(guò)這兩個(gè)都是通過(guò)計(jì)算位置進(jìn)行處理的),這里我就粘一下代碼了,這里一看就能懂
清單文件:

<android.support.design.widget.CoordinatorLayout
    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"
    tools:ignore="RtlHardcoded">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:elevation="0dp">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:scaleType="centerCrop"
                android:src="@mipmap/ic_launcher"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.9"/>

            <FrameLayout
                android:id="@+id/frameLayout"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_gravity="bottom|center_horizontal"
                android:background="@color/colorPrimaryDark"
                android:orientation="vertical"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.3">

            </FrameLayout>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none"
        app:behavior_overlapTop="30dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <include layout="@layout/uc_behavior"/>
    </android.support.v4.widget.NestedScrollView>

    <android.support.v7.widget.Toolbar
        android:id="@+id/main.toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimaryDark"
        app:layout_anchor="@id/frameLayout"
        app:theme="@style/ThemeOverlay.AppCompat.Dark"
        app:title="這個(gè)是toolBar的標(biāo)題">
    </android.support.v7.widget.Toolbar>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimaryDark"
        android:gravity="center"
        android:textColor="#fff"
        android:textSize="18sp"
        app:layout_behavior="com.hejin.materialdesign.behavior.ToolBarBehavior"/>

</android.support.design.widget.CoordinatorLayout>

這里注意一點(diǎn)啊,里面有一個(gè)屬性app:layout_anchor="@id/frameLayout"這個(gè)屬性代表有依附的意思,簡(jiǎn)單的說(shuō)就是通過(guò)依附達(dá)到共同享用滑動(dòng)事件的意思,也就是說(shuō)上面的FramLayout滑動(dòng)的時(shí)候ToolBar就會(huì)一起跟著滑動(dòng)的,這里依附的話(huà),會(huì)在被依附的控件的最上邊
behavior文件

/**
 * 作者 : 賀金龍
 * 創(chuàng)建時(shí)間 :  2017/11/8 14:41
 * 類(lèi)描述 : 實(shí)現(xiàn)ToolBar和TextView聯(lián)動(dòng)的Behavior
 * 類(lèi)說(shuō)明 :
 */
public class ToolBarBehavior extends CoordinatorLayout.Behavior<TextView> {

    private int mStartY;

    public ToolBarBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency) {
        return dependency instanceof Toolbar;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency) {
        if (mStartY == 0) {/*這里獲取的是點(diǎn)擊處對(duì)控件頂部的距離*/
            mStartY = (int) dependency.getY();
        }

        /*計(jì)算ToolBar從開(kāi)始引動(dòng)到最后的百分比,也就是ToolBar的當(dāng)前高度比上總高度*/
        float percent = dependency.getY() / mStartY;

        /*改變child的坐標(biāo)(從消失到可見(jiàn))*/
        child.setY(child.getHeight() * (1 - percent) - child.getHeight());
        return true;
    }
}

2017年11月09日添加:

自定義簡(jiǎn)書(shū)的Behavior

public class BottomBehavior extends CoordinatorLayout.Behavior<View> {

    public BottomBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof AppBarLayout;
    }

    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        float translationY = Math.abs(dependency.getTop());//獲取更隨布局的頂部位置
        child.setTranslationY(translationY);
        return true;
    }
}

這里寫(xiě)了好久都沒(méi)有成功,后來(lái)我發(fā)現(xiàn)了一個(gè)問(wèn)題,toolBar在移動(dòng)的時(shí)候是嵌套在AppBarLayout中的,所以你是監(jiān)聽(tīng)不到,因此這里不能使用ToolBar而是使用的AppBarLayout

感覺(jué)要是真的像自定義一些很難的還是不行,加強(qiáng)學(xué)習(xí)吧


2018年03月19日補(bǔ)充

其實(shí)關(guān)于自定義Behavior的內(nèi)容,之前自己了解的不夠,今天補(bǔ)充一些內(nèi)容

補(bǔ)充說(shuō)明1:

首先你要理解那個(gè)是依賴(lài)的View,那個(gè)是被觀察的View(我這里是這么理解的)

上面所有的child代表的是被觀察的View(也就是綁定的View,說(shuō)白了就是在xml布局中設(shè)置layout_behavior的那個(gè)View)

補(bǔ)充說(shuō)明2:

這里面有一個(gè)API->ViewCompat.offsetTopAndBottom(view, offset);
這個(gè)方法的意思是,使view移動(dòng)相應(yīng)的位置,位置的大小取決于offset,向下為正,向上為負(fù),這里面還有左右移動(dòng)的,api和這個(gè)類(lèi)似,自己找一下就可以了

補(bǔ)充說(shuō)明3:

  1. 一般處理兩個(gè)View之間的移動(dòng)的時(shí)候,都會(huì)用到
    boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency)
    這個(gè)方法是處理相應(yīng)的依賴(lài)關(guān)系的,也就是上面說(shuō)的依賴(lài)和被觀察的關(guān)系
    onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency)
    這個(gè)方法是處理相應(yīng)位置的改變的一些內(nèi)容的,說(shuō)簡(jiǎn)單點(diǎn)就是當(dāng)你被觀察的View位置什么的發(fā)生改變就會(huì)回調(diào)這個(gè)方法.

2.當(dāng)處理滑動(dòng)的時(shí)候會(huì)用到幾個(gè)相應(yīng)的方法

  • boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type)
    這個(gè)是在你手指觸碰到控件的時(shí)候調(diào)用的方法,這里面參數(shù)有必要說(shuō)明一下:
    參數(shù)1:coordinatorLayout對(duì)象,這個(gè)沒(méi)有什么好說(shuō)的
    參數(shù)2:child這個(gè)是相應(yīng)的被觀察者,也就是要被移動(dòng)的那個(gè)view
    參數(shù)3:directTargetChild我理解這個(gè)參數(shù)是滑動(dòng)的直接子View(這個(gè)我不太確定)
    參數(shù)4:target這個(gè)是被觀察的View
    參數(shù)5:代表是水平滑動(dòng)還是豎直滑動(dòng)的一個(gè)類(lèi)型值取值包含ViewCompat#SCROLL_AXIS_HORIZONTAL\ViewCompat#SCROLL_AXIS_VERTICAL分別對(duì)應(yīng)著豎直和水平滑動(dòng),
    參數(shù)6:代表一個(gè)type的值,沒(méi)用到可能是下面的那個(gè)方法做區(qū)分用的吧;
    這里引用一個(gè)判斷豎直滾動(dòng)的例子
    @Override
    public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
        return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
    }
  • void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type)
    這個(gè)方法是滾動(dòng)的時(shí)候調(diào)用的,當(dāng)滾動(dòng)發(fā)生的時(shí)候,這里計(jì)算出了相應(yīng)的數(shù)值,還是簡(jiǎn)單的說(shuō)明一下不一樣的參數(shù)吧!
    參數(shù)4參數(shù)5:dx代表x/y軸的速度值
    參數(shù)6我也沒(méi)弄明白是什么,我打印的時(shí)候一直是0
    這里引用一個(gè)聯(lián)動(dòng)的例子
    @Override
    public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        int leftScrolled = target.getScrollY();//獲取滾動(dòng)的Y軸的距離
        child.setScrollY(leftScrolled);
    }

很好理解,就是目標(biāo)滾的距離是多少就讓依賴(lài)的View滾多遠(yuǎn)

boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, float velocityX, float velocityY)
這個(gè)方法就是滾動(dòng)的慣性,就是當(dāng)你使用了很大力氣的時(shí)候推一下,當(dāng)你松手的時(shí)候他還會(huì)滾一段時(shí)間的.也是簡(jiǎn)單說(shuō)一下參數(shù)
參數(shù)4和參數(shù)5代表的是松手時(shí)刻的瞬時(shí)速度
上個(gè)例子

    @Override
    public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, float velocityX, float velocityY) {
        ((NestedScrollView) child).fling((int) velocityY);
        return true;
    }

這里就直接把相應(yīng)的速度進(jìn)行傳遞就可以了!


就先些這些吧!今天有點(diǎn)累了,眼睛有點(diǎn)疼,其實(shí)我覺(jué)得這個(gè)后期多些兩個(gè)就會(huì)了~~~
下面這些文章準(zhǔn)備不累的時(shí)候好好實(shí)現(xiàn)一下...
http://blog.csdn.net/king1425/article/details/61923877
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0224/3991.html
http://www.lxweimin.com/p/488283f74e69
http://www.lxweimin.com/p/82d18b0d18f4


這一系列文章的地址,希望對(duì)大家有幫助

項(xiàng)目地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評(píng)論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,904評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,633評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,368評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,736評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,919評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,235評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,427評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,656評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,055評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,348評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,160評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,380評(píng)論 2 379

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