ViewPager2 系列-- 初探ViewPager2

ViewPager2是什么

ViewPager2是Android Jetpack庫(kù)中的一個(gè)組件,是用于在應(yīng)用程序中實(shí)現(xiàn)頁(yè)面切換和滑動(dòng)效果的容器。

ViewPager2的作用和用途

ViewPager2是一個(gè)功能強(qiáng)大的滑動(dòng)容器,可以應(yīng)用于多種場(chǎng)景中,提供了靈活的頁(yè)面切換和布局定制功能,使得應(yīng)用程序界面更加豐富和交互性強(qiáng),可以用于以下場(chǎng)景:

  1. 實(shí)現(xiàn)引導(dǎo)頁(yè)或歡迎頁(yè):ViewPager2可以用于創(chuàng)建引導(dǎo)頁(yè)或歡迎頁(yè)甜刻,讓用戶通過(guò)滑動(dòng)瀏覽介紹應(yīng)用程序功能或展示歡迎內(nèi)容绍撞。

  2. 創(chuàng)建圖片瀏覽器:ViewPager2可以用于創(chuàng)建圖片瀏覽器,允許用戶通過(guò)滑動(dòng)來(lái)切換不同的圖片罢吃,并支持縮放和手勢(shì)交互楚午。

  3. 構(gòu)建輪播圖:ViewPager2非常適合構(gòu)建輪播圖功能,可以通過(guò)適配器動(dòng)態(tài)加載不同的輪播項(xiàng)尿招,并提供自動(dòng)循環(huán)滾動(dòng)的功能矾柜。

  4. 實(shí)現(xiàn)選項(xiàng)卡式布局:結(jié)合TabLayout,ViewPager2可以用于創(chuàng)建選項(xiàng)卡式布局就谜,讓用戶通過(guò)滑動(dòng)選項(xiàng)卡來(lái)切換不同的內(nèi)容頁(yè)面怪蔑。

  5. 創(chuàng)建垂直滑動(dòng)頁(yè)面:與ViewPager不同,ViewPager2支持垂直方向的滑動(dòng)丧荐,因此可以用于創(chuàng)建垂直滑動(dòng)的頁(yè)面布局缆瓣,例如垂直滑動(dòng)的導(dǎo)航菜單或垂直的新聞列表。

  6. 實(shí)現(xiàn)分頁(yè)數(shù)據(jù)展示:ViewPager2可以用于展示分頁(yè)數(shù)據(jù)虹统,例如將大量數(shù)據(jù)按頁(yè)加載并在每一頁(yè)中展示一部分內(nèi)容弓坞。

  7. 嵌套滑動(dòng)布局:ViewPager2可以與其他滑動(dòng)組件(如RecyclerView)嵌套使用,實(shí)現(xiàn)復(fù)雜的滑動(dòng)布局結(jié)構(gòu)车荔。

  8. 實(shí)現(xiàn)自定義的滑動(dòng)效果:通過(guò)使用自定義的轉(zhuǎn)換器(Transformer)渡冻,可以實(shí)現(xiàn)各種炫酷的頁(yè)面切換效果,例如漸變忧便、縮放族吻、旋轉(zhuǎn)等。

ViewPager2相較于ViewPager的改進(jìn)和優(yōu)勢(shì)

ViewPager2是對(duì)ViewPager的改進(jìn)版本珠增,提供了更好的性能超歌、更靈活的適配器和更豐富的功能。它是構(gòu)建滑動(dòng)頁(yè)面布局的首選組件蒂教,可以在應(yīng)用程序中實(shí)現(xiàn)各種滑動(dòng)頁(yè)面的需求巍举,并提供更好的用戶體驗(yàn),大致有以下幾點(diǎn)改進(jìn)和優(yōu)勢(shì):

  1. 支持垂直滑動(dòng):ViewPager2是在ViewPager的基礎(chǔ)上進(jìn)行改進(jìn)的悴品,最顯著的改進(jìn)之一是支持垂直滑動(dòng)禀综。而在ViewPager中,只支持水平滑動(dòng)苔严。這使得ViewPager2在創(chuàng)建垂直布局或特定場(chǎng)景下的垂直滑動(dòng)功能更加方便和靈活。

  2. 更好的性能和穩(wěn)定性:ViewPager2內(nèi)部實(shí)現(xiàn)使用了RecyclerView作為容器孤澎,而不再依賴于ViewPager的實(shí)現(xiàn)方式届氢。這使得ViewPager2具有RecyclerView的優(yōu)勢(shì),例如更好的性能和內(nèi)存管理覆旭、更流暢的滑動(dòng)體驗(yàn)以及更好的布局回收和復(fù)用機(jī)制退子。同時(shí)岖妄,ViewPager2還解決了ViewPager一些已知的問(wèn)題和不穩(wěn)定性,如條目位置錯(cuò)亂寂祥、刷新數(shù)據(jù)的不及時(shí)等荐虐。

  3. 支持使用Fragment作為頁(yè)面:與ViewPager不同,ViewPager2直接支持使用Fragment作為頁(yè)面丸凭,而無(wú)需通過(guò)FragmentPagerAdapter或FragmentStatePagerAdapter進(jìn)行適配福扬。這簡(jiǎn)化了頁(yè)面管理和生命周期處理,并提供了更直觀和一致的使用體驗(yàn)惜犀。

  4. 更靈活的適配器:ViewPager2引入了新的適配器接口铛碑,即RecyclerView.Adapter的子類RecyclerView.Adapter。這使得適配器的創(chuàng)建和管理更加靈活虽界,同時(shí)提供了更多的功能和擴(kuò)展性汽烦。

  5. 更豐富的功能和接口:ViewPager2提供了許多新的功能和接口,例如支持頁(yè)面預(yù)加載莉御、更強(qiáng)大的頁(yè)面切換動(dòng)畫支持撇吞、更豐富的回調(diào)接口等。這些功能和接口使得開(kāi)發(fā)者能夠更好地控制和定制ViewPager2的行為和外觀礁叔。

環(huán)境配置和依賴

  1. 在你的項(xiàng)目模塊的build.gradle文件中牍颈,添加以下依賴項(xiàng):
dependencies {
    // ...
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
}

  1. 確保你的項(xiàng)目使用了AndroidX,可以在gradle.properties文件中添加以下配置:
arduinoCopy code
android.useAndroidX=true
android.enableJetifier=true

ViewPager2基本用法

  • 創(chuàng)建一個(gè)包含ViewPager2的布局文件

  • 在Activity或Fragment中查找和實(shí)例化ViewPager2

  • 創(chuàng)建和設(shè)置適配器(Adapter)來(lái)管理ViewPager2的內(nèi)容

  • 設(shè)置適配器到ViewPager2實(shí)例

與View結(jié)合使用

以下是使用Kotlin的ViewPager2基本用法示例:

  1. 在XML布局文件中定義ViewPager2:
<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

  1. 在Activity或Fragment中晴圾,獲取ViewPager2實(shí)例并設(shè)置適配器:
val viewPager: ViewPager2 = findViewById(R.id.viewPager)
val adapter = MyAdapter() // 自定義適配器颂砸,需要繼承RecyclerView.Adapter<ViewHolder>
viewPager.adapter = adapter

  1. 創(chuàng)建自定義適配器MyAdapter,繼承自RecyclerView.Adapter<ViewHolder>
class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {

    // 在這里定義你的數(shù)據(jù)源
    private val dataList: MutableList<String> = mutableListOf()

    // 添加數(shù)據(jù)到數(shù)據(jù)源
    fun setData(data: List<String>) {
        dataList.clear()
        dataList.addAll(data)
        notifyDataSetChanged()
    }

    // 創(chuàng)建ViewHolder
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_view, parent, false)
        return MyViewHolder(view)
    }

    // 綁定數(shù)據(jù)到ViewHolder
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = dataList[position]
        holder.bindData(data)
    }

    // 返回?cái)?shù)據(jù)源的大小
    override fun getItemCount(): Int {
        return dataList.size
    }
}

  1. 創(chuàng)建ViewHolder類MyViewHolder死姚,繼承自RecyclerView.ViewHolder
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    private val textView: TextView = itemView.findViewById(R.id.textView)

    fun bindData(data: String) {
        textView.text = data
    }
}

  1. item_view.xml布局文件中定義每個(gè)頁(yè)面的布局人乓,例如一個(gè)簡(jiǎn)單的TextView:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/itemLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:padding="16dp" />

</LinearLayout>

注意:布局文件的根視圖的寬度和高度設(shè)置為match_parent ,否則會(huì)報(bào)錯(cuò):

java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

通過(guò)上述步驟都毒,就可以在ViewPager2中顯示自定義的頁(yè)面色罚,并通過(guò)適配器來(lái)管理數(shù)據(jù)源和頁(yè)面布局。

與Fragment結(jié)合使用

ViewPager2除了配合View使用账劲,更多會(huì)和Fragment結(jié)合使用戳护,此時(shí)我們只需要借助FragmentStateAdapter,簡(jiǎn)單實(shí)現(xiàn)如下:


class MyFragmentStateAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {

    private val fragmentList = listOf(
        FirstFragment(),
        SecondFragment(),
        ThirdFragment()
    )

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }
}

然后瀑焦,在MainActivity中使用ViewPager2和適配器:


class MainActivity : AppCompatActivity() {

    private lateinit var viewPager: ViewPager2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager = findViewById(R.id.viewPager)
        val adapter = MyFragmentStateAdapter(this)
        viewPager.adapter = adapter
    }
}

如何監(jiān)聽(tīng)頁(yè)面切換事件

要監(jiān)聽(tīng)頁(yè)面切換事件腌且,你可以在 ViewPager2 上設(shè)置一個(gè) OnPageChangeCallback 對(duì)象來(lái)監(jiān)聽(tīng)頁(yè)面的變化。OnPageChangeCallback 提供了幾個(gè)方法榛瓮,可以在頁(yè)面被選中铺董、滾動(dòng)和滾動(dòng)狀態(tài)改變時(shí)觸發(fā)相應(yīng)的回調(diào)。

下面是一個(gè)示例禀晓,展示了如何監(jiān)聽(tīng)頁(yè)面切換事件:

import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback

class MainActivity : AppCompatActivity() {

    private lateinit var viewPager: ViewPager2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager = findViewById(R.id.viewPager)

        // 設(shè)置頁(yè)面切換監(jiān)聽(tīng)
        viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                // 當(dāng)頁(yè)面選中時(shí)觸發(fā)回調(diào)
                // 在這里可以根據(jù)需要執(zhí)行相應(yīng)的操作
            }

            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {
                // 當(dāng)頁(yè)面滾動(dòng)時(shí)觸發(fā)回調(diào)
                // 在這里可以根據(jù)需要執(zhí)行相應(yīng)的操作
            }

            override fun onPageScrollStateChanged(state: Int) {
                // 當(dāng)頁(yè)面滾動(dòng)狀態(tài)改變時(shí)觸發(fā)回調(diào)
                // 在這里可以根據(jù)需要執(zhí)行相應(yīng)的操作
            }
        })
    }
}

頁(yè)面滾動(dòng)狀態(tài)都有哪些

ViewPager2 的頁(yè)面滾動(dòng)狀態(tài)有三種精续,分別對(duì)應(yīng)不同的整數(shù)值:

  1. ViewPager2.SCROLL_STATE_IDLE(值為 0):空閑狀態(tài)坝锰。表示當(dāng)前頁(yè)面處于靜止?fàn)顟B(tài),沒(méi)有正在進(jìn)行的滾動(dòng)操作重付。

  2. ViewPager2.SCROLL_STATE_DRAGGING(值為 1):拖動(dòng)狀態(tài)顷级。表示用戶正在拖動(dòng)頁(yè)面,準(zhǔn)備進(jìn)行滾動(dòng)操作确垫。

  3. ViewPager2.SCROLL_STATE_SETTLING(值為 2):滾動(dòng)狀態(tài)弓颈。表示頁(yè)面正在自動(dòng)滾動(dòng)到最終的位置。

可以通過(guò) ViewPager2.OnPageChangeCallbackonPageScrollStateChanged() 方法中的 state 參數(shù)獲取當(dāng)前的頁(yè)面滾動(dòng)狀態(tài)森爽。根據(jù)不同的狀態(tài)值恨豁,可以執(zhí)行相應(yīng)的操作,例如顯示加載指示器爬迟、更新界面等橘蜜。

自定義動(dòng)畫切換動(dòng)畫和過(guò)渡效果

要自定義頁(yè)面切換動(dòng)畫和過(guò)渡效果,我們可以使用 ViewPager2.PageTransformer 接口來(lái)實(shí)現(xiàn)付呕。PageTransformer 允許在頁(yè)面切換時(shí)對(duì)頁(yè)面應(yīng)用自定義的動(dòng)畫和過(guò)渡效果计福。

下面是一個(gè)示例,展示了如何自定義頁(yè)面切換動(dòng)畫和過(guò)渡效果:

import android.view.View
import androidx.viewpager2.widget.ViewPager2

class CustomPageTransformer : ViewPager2.PageTransformer {

    override fun transformPage(page: View, position: Float) {
        val absPosition = Math.abs(position)

        // 在這里根據(jù)需要對(duì)頁(yè)面進(jìn)行自定義動(dòng)畫和過(guò)渡效果的操作

        // 例如徽职,可以對(duì)頁(yè)面進(jìn)行縮放和透明度變化
        page.scaleY = 0.85f + (1f - 0.85f) * (1f - absPosition)
        page.alpha = 0.5f + (1f - 0.5f) * (1f - absPosition)
    }
}

在上述示例中象颖,我們創(chuàng)建了一個(gè)名為 CustomPageTransformer 的類,并實(shí)現(xiàn)了 ViewPager2.PageTransformer 接口姆钉。在 transformPage() 方法中说订,我們可以根據(jù)需要對(duì)每個(gè)頁(yè)面進(jìn)行自定義的動(dòng)畫和過(guò)渡效果。

在這個(gè)示例中潮瓶,我們對(duì)頁(yè)面進(jìn)行了簡(jiǎn)單的縮放和透明度變化陶冷。根據(jù)頁(yè)面的位置(position),我們?cè)O(shè)置了不同的縮放和透明度值毯辅。

接下來(lái)埂伦,將 CustomPageTransformer 應(yīng)用到 ViewPager2 上:

val viewPager: ViewPager2 = findViewById(R.id.viewPager)
val adapter = MyAdapter()
viewPager.adapter = adapter

val pageTransformer = CustomPageTransformer()
viewPager.setPageTransformer(pageTransformer)

在這個(gè)示例中,我們首先實(shí)例化了 ViewPager2 和適配器 MyAdapter思恐。然后沾谜,我們創(chuàng)建了 CustomPageTransformer 的實(shí)例,并通過(guò) setPageTransformer() 方法將其應(yīng)用到 ViewPager2 上胀莹。

如何禁用或限制頁(yè)面切換

要禁用或限制頁(yè)面切換基跑,可以使用 ViewPager2.OnPageChangeCallback 監(jiān)聽(tīng)器來(lái)控制頁(yè)面切換的行為。通過(guò)在回調(diào)方法中處理邏輯描焰,你可以決定是否允許頁(yè)面切換涩僻。

下面是一個(gè)示例,展示了如何禁用或限制頁(yè)面切換:

import androidx.viewpager2.widget.ViewPager2

class CustomOnPageChangeCallback : ViewPager2.OnPageChangeCallback() {

    private var isPageChangeEnabled = true

    fun setPageChangeEnabled(enabled: Boolean) {
        isPageChangeEnabled = enabled
    }

    override fun onPageSelected(position: Int) {
        if (!isPageChangeEnabled) {
            // 如果頁(yè)面切換被禁用栈顷,則強(qiáng)制將選中的頁(yè)面切換回原始位置
            // 這樣可以避免用戶手動(dòng)滑動(dòng)頁(yè)面
            val viewPager = /* 獲取 ViewPager2 實(shí)例 */
            viewPager.setCurrentItem(/* 原始位置 */, false)
        }
    }

    override fun onPageScrollStateChanged(state: Int) {
        if (!isPageChangeEnabled && state == ViewPager2.SCROLL_STATE_DRAGGING) {
            // 如果頁(yè)面切換被禁用逆日,并且用戶嘗試拖動(dòng)頁(yè)面,
            // 則強(qiáng)制將滾動(dòng)狀態(tài)設(shè)置為 SCROLL_STATE_IDLE萄凤,防止頁(yè)面滾動(dòng)
            val viewPager = /* 獲取 ViewPager2 實(shí)例 */
            viewPager.scrollToPosition(/* 原始位置 */)
        }
    }
}

在上述示例中室抽,我們創(chuàng)建了一個(gè)名為 CustomOnPageChangeCallback 的類,繼承自 ViewPager2.OnPageChangeCallback靡努。我們添加了一個(gè) setPageChangeEnabled() 方法坪圾,用于啟用或禁用頁(yè)面切換。

onPageSelected() 方法中惑朦,我們檢查 isPageChangeEnabled 的狀態(tài)兽泄。如果頁(yè)面切換被禁用,我們使用 ViewPager2 實(shí)例將選中的頁(yè)面切換回原始位置漾月,這樣可以防止用戶手動(dòng)滑動(dòng)頁(yè)面病梢。

onPageScrollStateChanged() 方法中,我們檢查 isPageChangeEnabled 的狀態(tài)以及滾動(dòng)狀態(tài)梁肿。如果頁(yè)面切換被禁用蜓陌,并且用戶嘗試拖動(dòng)頁(yè)面,我們強(qiáng)制將滾動(dòng)狀態(tài)設(shè)置為 SCROLL_STATE_IDLE吩蔑,這樣可以防止頁(yè)面滾動(dòng)钮热。

然后,將 CustomOnPageChangeCallback 應(yīng)用到 ViewPager2 上:

val viewPager: ViewPager2 = findViewById(R.id.viewPager)
val adapter = MyAdapter()
viewPager.adapter = adapter

val onPageChangeCallback = CustomOnPageChangeCallback()
viewPager.registerOnPageChangeCallback(onPageChangeCallback)

在這個(gè)示例中烛芬,我們首先實(shí)例化了 ViewPager2 和適配器 MyAdapter隧期。然后,我們創(chuàng)建了 CustomOnPageChangeCallback 的實(shí)例赘娄,并通過(guò) registerOnPageChangeCallback() 方法將其注冊(cè)到 ViewPager2 上仆潮。

要禁用或啟用頁(yè)面切換,只需調(diào)用 setPageChangeEnabled() 方法并傳遞相應(yīng)的參數(shù)即可:

onPageChangeCallback.setPageChangeEnabled(false) // 禁用頁(yè)面切換
onPageChangeCallback.setPageChangeEnabled(true)

滑動(dòng)方向設(shè)置

要設(shè)置 ViewPager2 的滑動(dòng)方向擅憔,你可以通過(guò)設(shè)置 Orientation 屬性來(lái)實(shí)現(xiàn)鸵闪。ViewPager2 支持兩種滑動(dòng)方向:水平滑動(dòng)和垂直滑動(dòng)。

在布局文件中暑诸,將 ViewPager2android:orientation 屬性設(shè)置為 horizontal(水平滑動(dòng))或 vertical(垂直滑動(dòng))即可蚌讼。

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" />

在上述示例中,我們將 ViewPager2android:orientation 屬性設(shè)置為 "horizontal"个榕,以實(shí)現(xiàn)水平滑動(dòng)篡石。如果你想實(shí)現(xiàn)垂直滑動(dòng),只需將屬性值設(shè)置為 "vertical"西采。

頁(yè)面預(yù)加載

要設(shè)置 ViewPager2 的頁(yè)面預(yù)加載數(shù)量凰萨,你可以使用 setOffscreenPageLimit() 方法。setOffscreenPageLimit() 方法用于設(shè)置 ViewPager2 在當(dāng)前頁(yè)面附近預(yù)加載的頁(yè)面數(shù)量。

默認(rèn)情況下胖眷,ViewPager2 的頁(yè)面預(yù)加載數(shù)量為 1武通,即當(dāng)前頁(yè)面的左右各一個(gè)頁(yè)面會(huì)被預(yù)加載。你可以根據(jù)需要增加或減少預(yù)加載的頁(yè)面數(shù)量珊搀。

以下是示例代碼冶忱,展示了如何設(shè)置 ViewPager2 的頁(yè)面預(yù)加載數(shù)量為 2:

val viewPager: ViewPager2 = findViewById(R.id.viewPager)
viewPager.offscreenPageLimit = 2

在上述示例中,我們通過(guò) viewPager.offscreenPageLimit 屬性將頁(yè)面預(yù)加載數(shù)量設(shè)置為 2境析。這意味著在當(dāng)前頁(yè)面的左右各兩個(gè)頁(yè)面會(huì)被預(yù)加載囚枪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劳淆,隨后出現(xiàn)的幾起案子链沼,更是在濱河造成了極大的恐慌,老刑警劉巖沛鸵,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括勺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谒臼,警方通過(guò)查閱死者的電腦和手機(jī)朝刊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜈缤,“玉大人拾氓,你說(shuō)我怎么就攤上這事〉赘纾” “怎么了咙鞍?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)趾徽。 經(jīng)常有香客問(wèn)我续滋,道長(zhǎng),這世上最難降的妖魔是什么孵奶? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任疲酌,我火速辦了婚禮,結(jié)果婚禮上了袁,老公的妹妹穿的比我還像新娘朗恳。我一直安慰自己,他們只是感情好载绿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布粥诫。 她就那樣靜靜地躺著,像睡著了一般崭庸。 火紅的嫁衣襯著肌膚如雪怀浆。 梳的紋絲不亂的頭發(fā)上谊囚,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音执赡,去河邊找鬼镰踏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搀玖,可吹牛的內(nèi)容都是我干的余境。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灌诅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了含末?” 一聲冷哼從身側(cè)響起猜拾,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佣盒,沒(méi)想到半個(gè)月后挎袜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肥惭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盯仪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜葱。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡全景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牵囤,到底是詐尸還是另有隱情爸黄,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布揭鳞,位于F島的核電站炕贵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏野崇。R本人自食惡果不足惜称开,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乓梨。 院中可真熱鬧鳖轰,春花似錦、人聲如沸督禽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狈惫。三九已至睛蛛,卻和暖如春鹦马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忆肾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工荸频, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人客冈。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓旭从,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親场仲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子和悦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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