Live-client-1-UI界面的設(shè)計

在項目概覽時,已經(jīng)提及到客戶端有如下功能:登錄茂洒、注冊孟岛、開始直播、觀看直播督勺、查看直播記錄渠羞、查看本地視頻等。項目的UI如下圖所示智哀,讓我們來逐一解析每個頁面的特點次询。


Live-UI.png

Main主頁面

live-main.jpg
live-main-menu.jpg

從圖中可以看出,Main主頁面中有三個切圓角的按鈕瓷叫,上下按一定比例進行分割屯吊,而且每個按鈕中間都有一個圖標和文字,同時最上面的按鈕左上角還有一個menu的提示摹菠,表明還有一個抽屜側(cè)滑盒卸。于是就將抽屜布局DrawerLayout作為根布局,然后內(nèi)置Framelayout放置fragment次氨、NavigationView放置抽屜導航蔽介。

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/dl_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/contentFrame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <ImageView
            android:id="@+id/iv_main_menu"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_margin="16dp"
            android:clickable="true"
            android:focusable="true"
            android:src="@drawable/ic_menu" />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/drawer_actions" />
</androidx.drawerlayout.widget.DrawerLayout>

MainFragment

然后來看下fragment怎么寫:首先圓角的按鈕,第一個想到的就是就是用CardView卡片控件煮寡,然后再卡片里面放置圖標和文字屉佳,分上下兩層,通過權(quán)重的方式定義高度洲押,保證了不用分辨率的手機能夠保持一致的層次效果武花。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2">

        <androidx.cardview.widget.CardView
            android:id="@+id/cv_main_video"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:clickable="true"
            android:focusable="true"
            android:foreground="?android:attr/selectableItemBackground"
            app:cardBackgroundColor="@color/color_navy_blue"
            app:cardCornerRadius="10dp"
            app:cardElevation="8dp">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center">

                <ImageView
                    android:id="@+id/iv_video"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/ic_video" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/iv_video"
                    android:layout_centerHorizontal="true"
                    android:gravity="center"
                    android:text="播放視頻"
                    android:textColor="@android:color/white"
                    android:textSize="16sp" />
            </RelativeLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <androidx.cardview.widget.CardView
            android:id="@+id/cv_main_push"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:clickable="true"
            android:focusable="true"
            android:foreground="?android:attr/selectableItemBackground"
            app:cardBackgroundColor="#4cc154"
            app:cardCornerRadius="10dp"
            app:cardElevation="8dp">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center">

                <ImageView
                    android:id="@+id/iv_live"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:src="@mipmap/live" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/iv_live"
                    android:layout_centerHorizontal="true"
                    android:gravity="center"
                    android:text="主播"
                    android:textColor="@android:color/white"
                    android:textSize="16sp" />
            </RelativeLayout>
        </androidx.cardview.widget.CardView>

        <androidx.cardview.widget.CardView
            android:id="@+id/cv_main_play"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:clickable="true"
            android:focusable="true"
            android:foreground="?android:attr/selectableItemBackground"
            app:cardBackgroundColor="@color/weibo_orange"
            app:cardCornerRadius="10dp"
            app:cardElevation="8dp">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center">

                <ImageView
                    android:id="@+id/iv_play"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:src="@mipmap/play3" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/iv_play"
                    android:layout_centerHorizontal="true"
                    android:gravity="center"
                    android:text="觀眾"
                    android:textColor="@android:color/white"
                    android:textSize="16sp" />
            </RelativeLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</LinearLayout>

NavigationView menu菜單

在NavigationView中添加了@menu/drawer_actions這個菜單,該菜單中具有三個iteam杈帐,每個Iteam中都可以添加圖標:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group>
        <item
            android:id="@+id/navigation_menu_liveInfos"
            android:title="查看直播記錄"></item>
    </group>
    <group>
        <item
            android:id="@+id/navigation_menu_login"
            android:title="登錄"></item>
        <item
            android:id="@+id/navigation_menu_logout"
            android:title="注銷"></item>
    </group>
</menu>

NavigationView設(shè)置onNavigationItemSelectedListener就可以設(shè)置給menu的點擊事件体箕,進行頁面跳轉(zhuǎn)、信息查看等操作挑童。

登錄頁面

live-login.jpg

登錄累铅、注冊頁面中以一張極具美感的圖片作為背景,頂部有一個返回按鈕站叼,隨后將登錄娃兽、注冊等內(nèi)容放置在頁面的底部,并將該部分內(nèi)容背景設(shè)置為透明尽楔。

LoginActivity

同樣的使用Activity+fragment的形式進行布局投储。在Activity中第练,使用RelativeLayout作為根布局,放置一個ImageView作為全局背景玛荞,該ImageView的圖片來源來自必應(yīng)每日一圖娇掏。然后通過一個FrameLayout來加載一個具有登錄、注冊等信息的fragment勋眯,最后在FrameLayout的上一層添加頂部的返回按鈕婴梧。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:context=".login.LoginActivity">

    <ImageView
        android:id="@+id/iv_login_bing"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" />

    <FrameLayout
        android:id="@+id/contentFrame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:fitsSystemWindows="true" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="21dp"
        android:background="@android:color/transparent"
        android:fitsSystemWindows="true">
        <ImageView
            android:id="@+id/iv_login_back"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_margin="16dp"
            android:clickable="true"
            android:focusable="true"
            android:src="@drawable/ic_img_back" />
    </RelativeLayout>
</RelativeLayout>

細心的朋友應(yīng)該會發(fā)現(xiàn)頁面的頂部狀態(tài)欄背景都成為了每日一圖的一部分,使得整個界面更為美觀客蹋,更為賞心悅目塞蹭。那是怎么實現(xiàn)的呢?
這就需要在Activity中通過代碼來實現(xiàn):

if (Build.VERSION.SDK_INT >= 21) { //android 5.0以上系統(tǒng)讶坯,狀態(tài)欄也顯示圖片
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }

首先獲取Window中的decorView浮还,然后通過該decorView設(shè)置SystemUI的顯示情況,最后將該部分背景設(shè)置為透明闽巩,于是必應(yīng)每日一圖就會顯示到狀態(tài)欄上钧舌。

LoginFragment

這部分包含了賬號的填寫、密碼的填寫涎跨、驗證碼的填寫洼冻、獲取驗證碼按鈕、登錄按鈕隅很、注冊按鈕撞牢、返回登錄按鈕等內(nèi)容,各個部分的展示叔营,需要通過View的visibility屬性來設(shè)置屋彪。
賬號、密碼绒尊、驗證碼的填寫都是通過TextInputLayout和TextInputEditText兩個控件配合使用畜挥,達到提示框自動收縮、內(nèi)容驗證等效果婴谱,是目前比較流程的文本框?qū)崿F(xiàn)方式蟹但。
登錄、注冊按鈕則是通過一張切了彎角的白色背景圖片來實現(xiàn)谭羔。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_margin="8dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_login_head"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="登錄LIVE华糖,開啟美好一天"
            android:textColor="@android:color/white"
            android:textSize="24sp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:baselineAligned="false"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="35dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="35dp"
                android:orientation="horizontal">

                <com.google.android.material.textfield.TextInputLayout
                    android:background="@drawable/login_bg_selector"
                    android:id="@+id/til_login_account"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_weight="1"
                    android:textColorHint="@color/colorAccent"
                    app:errorTextAppearance="@style/EditTextErrorAppearance">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/et_login_account"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="start"
                        android:hint="手機號"
                        android:imeOptions="actionGo"
                        android:inputType="number"
                        android:maxLength="20"
                        android:maxLines="1"
                        android:textColor="@android:color/white" />

                </com.google.android.material.textfield.TextInputLayout>

                <Button
                    android:id="@+id/bt_login_email_phone"
                    android:layout_width="32dp"
                    android:layout_height="32dp"
                    android:layout_gravity="center"
                    android:layout_marginLeft="8dp"
                    android:background="@drawable/ic_email"
                    android:tag="email" />
            </LinearLayout>


            <com.google.android.material.textfield.TextInputLayout
                android:background="@drawable/login_bg_selector"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="35dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="35dp"

                android:textColorHint="@color/colorAccent"
                app:errorTextAppearance="@style/EditTextErrorAppearance">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/et_login_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="start"
                    android:hint="密碼"
                    android:inputType="textPassword"
                    android:maxLength="20"
                    android:maxLines="1"
                    android:textColor="@android:color/white" />
            </com.google.android.material.textfield.TextInputLayout>

            <LinearLayout
                android:id="@+id/ll_login_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="35dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="35dp"
                android:orientation="horizontal"
                android:visibility="gone">

                <com.google.android.material.textfield.TextInputLayout
                    android:background="@drawable/login_bg_selector"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_weight="3"
                    android:textColorHint="@color/colorAccent"
                    app:errorTextAppearance="@style/EditTextErrorAppearance">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/et_login_code"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="start"
                        android:hint="驗證碼"
                        android:inputType="textPassword"
                        android:maxLength="20"
                        android:maxLines="1"
                        android:textColor="@android:color/white" />

                </com.google.android.material.textfield.TextInputLayout>

                <Button
                    android:id="@+id/bt_login_code"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="8dp"
                    android:layout_marginTop="8dp"
                    android:layout_marginBottom="8dp"
                    android:layout_weight="1"
                    android:background="@drawable/button_circle_ripple"
                    android:gravity="center"
                    android:text="獲取驗證碼"
                    android:textColor="@android:color/white"
                    android:textSize="12sp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="35dp"
                android:layout_marginTop="10dp"
                android:layout_marginRight="35dp"
                android:layout_marginBottom="20dp"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bt_login_undo"
                    android:layout_width="32dp"
                    android:layout_height="32dp"
                    android:layout_gravity="center_vertical"
                    android:layout_marginRight="8dp"
                    android:background="@drawable/ic_undo"
                    android:visibility="gone" />

                <Button
                    android:id="@+id/bt_login_register"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="8dp"
                    android:layout_weight="1"
                    android:background="@drawable/phone_login_button_bg"
                    android:text="注冊"
                    android:textColor="@color/colorPrimary"
                    android:textSize="16sp" />

                <Button
                    android:id="@+id/bt_login_login"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="8dp"
                    android:layout_weight="1"
                    android:background="@drawable/phone_login_button_bg"
                    android:text="登錄"
                    android:textColor="@color/colorPrimary"
                    android:textSize="16sp" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

直播頁面

live-living.jpg

直播頁面有三部分組成:

  1. TextureView:接收相機的回傳圖像
  2. 返回按鈕和攝像頭切換按鈕
  3. 自定義直播按鈕。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextureView
        android:id="@+id/tv_push_texture"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <include layout="@layout/title"/>

    <com.ljh.live.ui.ShutterButton
        android:id="@+id/btn_push_shutter"
        android:layout_marginBottom="16dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_width="75dp"
        android:layout_height="75dp" />
</RelativeLayout>

自定義直播按鈕

繼承了Button組件瘟裸,由兩部分構(gòu)成:內(nèi)部圓與外部圓客叉,兩部分圓通過canvas.drawCircle()和不同的狀態(tài)進行不同顏色的繪制。

public class ShutterButton extends Button {

    private Paint mPaint;
    private int outerRadius;
    private int innerRadius;
    private int outerCircleColor;
    private int innerCircleColor;
    private int recordColor;
    private RectF rect;
    private String TAG = ShutterButton.class.getSimpleName();

    private String currentMode = PHOTO_MODE;
    public static final String PHOTO_MODE = "photo_mode";
    public static final String VIDEO_MODE = "video_mode";
    public static final String VIDEO_RECORDING_MODE = "video_record_mode";

    public ShutterButton(Context context) {
        this(context, null);
    }

    public ShutterButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShutterButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        outerRadius = (int) context.getResources().getDimension(R.dimen.shutter_outer_radius);
        outerCircleColor = context.getResources().getColor(R.color.outer_circle_color);
        innerCircleColor = context.getResources().getColor(R.color.inner_circle_color);
        recordColor = context.getResources().getColor(R.color.color_record);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        rect = new RectF();
    }


    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        innerRadius = (int) (getWidth() / 2 - 2.5 * outerRadius);
        int innerSmallRadius = getWidth() / 10;
        rect.left = getWidth() / 2 - innerSmallRadius;
        rect.top = getHeight() / 2 - innerSmallRadius;
        rect.right = getWidth() / 2 + innerSmallRadius;
        rect.bottom = getHeight() / 2 + innerSmallRadius;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        switch (currentMode) {
            case PHOTO_MODE:
                drawOuterCircle(canvas, outerCircleColor);
                drawInnerCircle(canvas, innerCircleColor);
                break;
            case VIDEO_MODE:
                drawOuterCircle(canvas, outerCircleColor);
                drawInnerCircle(canvas, innerCircleColor);
                break;
            case VIDEO_RECORDING_MODE:
                drawOuterCircle(canvas, innerCircleColor);
                drawInnerCircle(canvas, recordColor);
                break;
        }
    }

    public void setMode(String mode) {
        currentMode = mode;
        invalidate();
    }

    private void drawOuterCircle(Canvas canvas, int color) {
        mPaint.setColor(color);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(outerRadius);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - outerRadius, mPaint);
    }

    private void drawInnerCircle(Canvas canvas, int color) {
        mPaint.setColor(color);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, innerRadius, mPaint);
    }

    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        if (enabled) {
            setAlpha(1.0f);
        } else {
            setAlpha(0.5f);
        }
    }

    @Override
    public void setClickable(boolean clickable) {
        super.setClickable(clickable);
        if (clickable) {
            setAlpha(1.0f);
        } else {
            setAlpha(0.5f);
        }
    }
}

查看直播記錄和本地視頻列表頁面

這兩個頁面均是通過RecyclerView和自定義Item來實現(xiàn)。

直播記錄

特點在于通過兩個Spinner下拉框?qū)χ辈?shù)據(jù)進行排列和篩選

本地視頻列表

每個Item中兼搏,都含有一個ImageView來顯示視頻的縮略圖卵慰,而這個縮略圖是通過Glide進行加載,有占位圖片向族、異常圖片,同時取消內(nèi)存緩存棠绘,減少滑動時的內(nèi)存花銷件相。

Glide.with(holder.imageView)
                    .load(Uri.fromFile(new File(videoInfo.getVideoPath())))
                    .skipMemoryCache(true)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .placeholder(R.mipmap.error)
                    .error(R.mipmap.error)
                    .into(holder.imageView);

播放視頻和觀看直播

使用GSYVideoPlayer控件來實現(xiàn)播放功能。

拓展(持續(xù)更新中):

  1. AndroidUI-DrawerLayout+NavigationView
  2. AndroidUI-CardView
  3. AndroidUI-TextInputLayout+TextInputEditText
  4. AndroidUI-Spinner
  5. AndriodUI-RecyclerView
  6. 顏色的透明代碼
  7. AndroidUI-自定義View
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧苍,一起剝皮案震驚了整個濱河市夜矗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌让虐,老刑警劉巖紊撕,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赡突,居然都是意外死亡对扶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門惭缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪南,“玉大人,你說我怎么就攤上這事漱受÷缭洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵昂羡,是天一觀的道長絮记。 經(jīng)常有香客問我,道長虐先,這世上最難降的妖魔是什么怨愤? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蛹批,結(jié)果婚禮上憔四,老公的妹妹穿的比我還像新娘。我一直安慰自己般眉,他們只是感情好了赵,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甸赃,像睡著了一般柿汛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天络断,我揣著相機與錄音裁替,去河邊找鬼。 笑死貌笨,一個胖子當著我的面吹牛弱判,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锥惋,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昌腰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膀跌?” 一聲冷哼從身側(cè)響起遭商,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捅伤,沒想到半個月后劫流,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡丛忆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年祠汇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熄诡。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡座哩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粮彤,到底是詐尸還是另有隱情根穷,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布导坟,位于F島的核電站屿良,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惫周。R本人自食惡果不足惜尘惧,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望递递。 院中可真熱鬧喷橙,春花似錦、人聲如沸登舞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菠秒。三九已至疙剑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背言缤。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工嚼蚀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人管挟。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓轿曙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親僻孝。 傳聞我的和親對象是個殘疾皇子导帝,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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