Core Graphics 之 Core Graphics Layer Drawing (十三)

Core Graphics Layer Drawing

CGLayer對(duì)象(CGLayerRef數(shù)據(jù)類型)允許您的應(yīng)用程序使用圖層來(lái)繪圖。

層適用于以下情況:

您計(jì)劃重用的繪圖的高質(zhì)量屏幕外呈現(xiàn)。例如,您可能正在構(gòu)建場(chǎng)景并計(jì)劃重用相同的背景。繪制背景場(chǎng)景到一個(gè)層,然后繪制層,無(wú)論何時(shí)你需要它。另外一個(gè)好處是,您不需要知道顏色空間或與設(shè)備相關(guān)的信息就可以繪制到一個(gè)層。
重復(fù)的畫(huà)。例如,您可能希望創(chuàng)建一個(gè)由反復(fù)繪制的相同項(xiàng)組成的模式。將項(xiàng)目繪制到一個(gè)層,然后重復(fù)繪制該層,如圖12-1所示。您重復(fù)繪制的任何Quartz對(duì)象——包括CGPath、CGShading和CGPDFPage對(duì)象——如果您將其繪制到CGLayer,那么它的性能將得到改善。注意,一個(gè)圖層不只是用于屏幕繪圖;您可以將其用于不面向屏幕的圖形上下文,例如PDF圖形上下文。
緩沖。盡管您可以為此使用圖層,但您不需要這樣做,因?yàn)镼uartz合成體使您的部分不需要進(jìn)行緩沖。如果必須繪制到緩沖區(qū),則使用一個(gè)層而不是位圖圖形上下文。


屏幕快照 2018-08-28 上午10.56.04.png

CGLayer對(duì)象和透明層與CGPath對(duì)象和CGContext函數(shù)創(chuàng)建的路徑平行。在CGLayer或CGPath對(duì)象的情況下,您可以繪制到一個(gè)抽象的目的地,然后可以繪制完整的繪畫(huà)到另一個(gè)目的地,如顯示器或PDF。當(dāng)您繪制到一個(gè)透明層或使用繪制路徑的CGContext函數(shù)時(shí),您可以直接繪制到由圖形上下文表示的目的地。沒(méi)有中間的抽象目標(biāo)來(lái)組裝這幅畫(huà)。

How Layer Drawing Works

以CGLayerRef數(shù)據(jù)類型為代表的層被設(shè)計(jì)為最佳性能。如果可能的話,Quartz會(huì)使用一種適合于它所關(guān)聯(lián)的石英圖形上下文類型的機(jī)制來(lái)緩存CGLayer對(duì)象。例如,與顯卡關(guān)聯(lián)的圖形上下文可能會(huì)將該層緩存到顯卡上,這使得繪制層中的內(nèi)容比繪制由位圖圖形上下文構(gòu)造的類似圖像要快得多。由于這個(gè)原因,對(duì)于屏幕外繪圖,層通常是比位圖圖形上下文更好的選擇。

所有石英繪圖功能繪制到一個(gè)圖形上下文。圖形上下文提供目標(biāo)的抽象,將您從目標(biāo)的細(xì)節(jié)(如其分辨率)中解放出來(lái)。您在用戶空間中工作,Quartz會(huì)執(zhí)行必要的轉(zhuǎn)換,以將繪圖正確呈現(xiàn)到目的地。當(dāng)您使用CGLayer對(duì)象進(jìn)行繪圖時(shí),您也可以繪制到圖形上下文。圖12-1說(shuō)明了圖層繪制的必要步驟。


屏幕快照 2018-08-28 上午10.57.10.png

所有圖層的繪制都從一個(gè)圖形上下文開(kāi)始,你可以使用CGLayerCreateWithContext函數(shù)創(chuàng)建一個(gè)CGLayer對(duì)象。用于創(chuàng)建CGLayer對(duì)象的圖形上下文通常是窗口圖形上下文。Quartz創(chuàng)建了一個(gè)層,它具有圖形上下文的所有特性——分辨率、顏色空間和圖形狀態(tài)設(shè)置。如果不想使用圖形上下文的大小,可以為層提供一個(gè)大小。在圖12-2中,左側(cè)顯示用于創(chuàng)建層的圖形上下文。右側(cè)框的灰色部分,標(biāo)記為CGLayer對(duì)象,表示新創(chuàng)建的層。

在繪制到層之前,必須通過(guò)調(diào)用CGLayerGetContext函數(shù)來(lái)獲得與層關(guān)聯(lián)的圖形上下文。這個(gè)圖形上下文與用于創(chuàng)建層的圖形上下文相同。只要用于創(chuàng)建層的圖形上下文是窗口圖形上下文,那么CGLayer圖形上下文就會(huì)被緩存到GPU中。圖12-2右側(cè)框的白色部分表示新創(chuàng)建的圖層圖形上下文。

您可以像繪制任何圖形上下文一樣繪制到層的圖形上下文,將層的圖形上下文傳遞給繪圖函數(shù)。圖12-2顯示了繪制到層上下文的葉子形狀。

當(dāng)您準(zhǔn)備使用該層的內(nèi)容時(shí),您可以調(diào)用CGContextDrawLayerInRect或CGContextDrawLayerAtPoint函數(shù),將該層繪制到圖形上下文中。通常情況下,您會(huì)繪制與創(chuàng)建層對(duì)象時(shí)使用的圖形上下文相同的圖形,但并不需要這樣做。您可以將層繪制到任何圖形上下文,記住,層繪制具有用于創(chuàng)建層對(duì)象的圖形上下文的特征,這可能會(huì)帶來(lái)某些約束(例如性能或分辨率)。例如,與屏幕相關(guān)聯(lián)的層可以緩存在視頻硬件中。如果目標(biāo)上下文是打印上下文或PDF上下文,則可能需要將其從圖形硬件提取到內(nèi)存中,從而導(dǎo)致性能低下。

圖12-2顯示了層的內(nèi)容——頁(yè)反復(fù)繪制到用于創(chuàng)建層對(duì)象的圖形上下文。在釋放CGLayer對(duì)象之前,你可以重復(fù)使用層中的繪圖。

提示:當(dāng)你想要合成一個(gè)圖形的部分時(shí),使用透明層來(lái)達(dá)到像隱藏一組對(duì)象這樣的效果。(參見(jiàn)透明層)。使用CGLayer對(duì)象當(dāng)你想畫(huà)出屏幕外或當(dāng)你需要重復(fù)畫(huà)相同的東西。

Drawing with a Layer

要使用CGLayer對(duì)象繪制,您需要執(zhí)行以下部分描述的任務(wù):

使用現(xiàn)有的圖形上下文創(chuàng)建CGLayer對(duì)象初始化
獲取該層的圖形上下文
繪制到CGLayer圖形上下文
將層繪制到目標(biāo)圖形上下文
請(qǐng)參閱示例:使用多個(gè)CGLayer對(duì)象為詳細(xì)的代碼示例繪制標(biāo)記。

Create a CGLayer Object Initialized with an Existing Graphics Context

CGLayerCreateWithContext函數(shù)返回一個(gè)用現(xiàn)有圖形上下文初始化的層。該層繼承了圖形上下文的所有特征,包括顏色空間、大小、分辨率和像素格式。稍后,當(dāng)您將該層繪制到目的地時(shí),Quartz會(huì)自動(dòng)將該層與目標(biāo)上下文匹配。

CGLayerCreateWithContext函數(shù)需要三個(gè)參數(shù):

用于創(chuàng)建層的圖形上下文。通常,您傳遞一個(gè)窗口圖形上下文,以便稍后可以在屏幕上繪制該層。
相對(duì)于圖形上下文的層的大小。該層的大小可以與圖形上下文相同或更小。如果以后需要檢索層大小,可以調(diào)用CGLayerGetSize函數(shù)。
一個(gè)輔助字典。此參數(shù)當(dāng)前未使用,因此傳遞NULL。

Get a Graphics Context for the Layer

Quartz總是繪制到圖形上下文。既然已經(jīng)有了一個(gè)層,就必須創(chuàng)建一個(gè)與該層相關(guān)聯(lián)的圖形上下文。你在圖層中繪制的任何圖形都是圖層的一部分。

函數(shù)CGLayerGetContext接受一個(gè)層作為參數(shù),并返回一個(gè)與該層相關(guān)聯(lián)的圖形上下文。

Draw to the CGLayer Graphics Context

獲得與層相關(guān)聯(lián)的圖形上下文后,可以對(duì)層圖形上下文執(zhí)行任何繪圖操作。您可以打開(kāi)一個(gè)PDF文件或圖像文件,并將文件內(nèi)容繪制到該層。您可以使用任何一個(gè)Quartz 2D函數(shù)來(lái)繪制矩形、直線和其他繪圖原語(yǔ)。圖12-3顯示了將矩形和直線繪制到一個(gè)層的示例。


屏幕快照 2018-08-28 上午11.00.39.png

例如,要將填充矩形繪制到CGLayer圖形上下文,需要調(diào)用CGContextFillRect函數(shù),提供從CGLayerGetContext函數(shù)中獲得的圖形上下文。如果圖形上下文命名為myLayerContext,那么函數(shù)調(diào)用如下所示

CGContextFillRect (myLayerContext, myRect)
Draw the Layer to the Destination Graphics Context

當(dāng)你準(zhǔn)備繪制層到它的目標(biāo)圖形上下文,你可以使用以下任一功能:

CGContextDrawLayerInRect,它將一個(gè)層繪制到指定矩形中的圖形上下文。
CGContextDrawLayerAtPoint,它將層繪制到指定點(diǎn)的圖形上下文。
通常,您提供的目標(biāo)圖形上下文是窗口圖形上下文,它與創(chuàng)建層所用的圖形上下文相同。圖12-4顯示了重復(fù)繪制圖12-3所示的層圖的結(jié)果。為了實(shí)現(xiàn)圖形效果,您可以反復(fù)調(diào)用層繪制函數(shù)—cgcontextdrawlayeratpoint或cgcontextdrawlayerinrect—每次更改偏移量。例如,您可以在每次繪制層時(shí)調(diào)用函數(shù)CGContextTranslateCTM,以更改坐標(biāo)空間的原點(diǎn)。


屏幕快照 2018-08-28 下午12.52.11.png

注意:您不需要將一個(gè)層繪制到用于初始化該層的相同圖形上下文。然而,如果你把這個(gè)層繪制到另一個(gè)圖形上下文,原始圖形上下文的任何限制都會(huì)強(qiáng)加到你的繪圖上。

Example: Using Multiple CGLayer Objects to Draw a Flag

本節(jié)展示如何使用兩個(gè)CGLayer對(duì)象在屏幕上繪制如圖12-5所示的標(biāo)志。首先,您將看到如何將標(biāo)記簡(jiǎn)化為簡(jiǎn)單的繪圖原語(yǔ),然后您將看到完成繪圖所需的代碼。


屏幕快照 2018-08-28 下午12.53.40.png

從屏幕繪制的角度來(lái)看,國(guó)旗分為三個(gè)部分:

紅白條紋的圖案。您可以將模式減少為單個(gè)紅色條紋,因?yàn)閷?duì)于屏幕繪圖,您可以假定為白色背景。創(chuàng)建一個(gè)紅色矩形,然后在不同的偏移位置重復(fù)繪制矩形,創(chuàng)建美國(guó)國(guó)旗所需的7條紅色條紋。一層是理想的重復(fù)繪圖層。將紅色矩形繪制到一個(gè)層,然后在屏幕上繪制該層7次。
一個(gè)藍(lán)色的矩形。你需要藍(lán)色的矩形一次,所以使用一個(gè)圖層是沒(méi)有好處的。當(dāng)需要繪制藍(lán)色矩形時(shí),直接在屏幕上繪制。
50顆白色星星的圖案。像紅色條紋一樣,一層是畫(huà)星星的理想選擇。創(chuàng)建一個(gè)輪廓星形的路徑,然后用白色填充路徑。在一個(gè)圖層上畫(huà)一個(gè)星號(hào),然后畫(huà)50次,每次調(diào)整偏移以得到合適的間距。
圖12-2中的代碼產(chǎn)生了圖12-5所示的輸出。清單后面顯示了每一行代碼的詳細(xì)說(shuō)明。清單相當(dāng)長(zhǎng),所以您可能希望打印說(shuō)明,以便在查看代碼時(shí)能夠閱讀。myDrawFlag例程是從Cocoa應(yīng)用程序中調(diào)用的。應(yīng)用程序傳遞一個(gè)窗口圖形上下文和一個(gè)指定與窗口圖形上下文關(guān)聯(lián)的視圖大小的矩形。

注意:在調(diào)用這個(gè)或任何使用CGLayer對(duì)象的例程之前,您必須檢查系統(tǒng)是否運(yùn)行Mac OS X v10.4或更高版本,以及是否有支持使用CGLayer對(duì)象的顯卡。
Listing 12-1 Code that uses layers to draw a flag

void myDrawFlag (CGContextRef context, CGRect* contextRect)
{
    int          i, j,
                 num_six_star_rows = 5,
                 num_five_star_rows = 4;
    CGFloat      start_x = 5.0,// 1
                 start_y = 108.0,// 2
                 red_stripe_spacing = 34.0,// 3
                 h_spacing = 26.0,// 4
                 v_spacing = 22.0;// 5
    CGContextRef myLayerContext1,
                 myLayerContext2;
    CGLayerRef   stripeLayer,
                 starLayer;
    CGRect       myBoundingBox,// 6
                 stripeRect,
                 starField;
 // ***** Setting up the primitives *****
    const CGPoint myStarPoints[] = {{ 5, 5},   {10, 15},// 7
                                    {10, 15},  {15, 5},
                                    {15, 5},   {2.5, 11},
                                    {2.5, 11}, {16.5, 11},
                                    {16.5, 11},{5, 5}};
 
    stripeRect  = CGRectMake (0, 0, 400, 17); // stripe// 8
    starField  =  CGRectMake (0, 102, 160, 119); // star field// 9
 
    myBoundingBox = CGRectMake (0, 0, contextRect->size.width, // 10
                                      contextRect->size.height);
 
     // ***** Creating layers and drawing to them *****
    stripeLayer = CGLayerCreateWithContext (context, // 11
                            stripeRect.size, NULL);
    myLayerContext1 = CGLayerGetContext (stripeLayer);// 12
 
    CGContextSetRGBFillColor (myLayerContext1, 1, 0 , 0, 1);// 13
    CGContextFillRect (myLayerContext1, stripeRect);// 14
 
    starLayer = CGLayerCreateWithContext (context,
                            starField.size, NULL);// 15
    myLayerContext2 = CGLayerGetContext (starLayer);// 16
    CGContextSetRGBFillColor (myLayerContext2, 1.0, 1.0, 1.0, 1);// 17
    CGContextAddLines (myLayerContext2, myStarPoints, 10);// 18
    CGContextFillPath (myLayerContext2);    // 19
 
     // ***** Drawing to the window graphics context *****
    CGContextSaveGState(context);    // 20
    for (i=0; i< 7;  i++)   // 21
    {
        CGContextDrawLayerAtPoint (context, CGPointZero, stripeLayer);// 22
        CGContextTranslateCTM (context, 0.0, red_stripe_spacing);// 23
    }
    CGContextRestoreGState(context);// 24
 
    CGContextSetRGBFillColor (context, 0, 0, 0.329, 1.0);// 25
    CGContextFillRect (context, starField);// 26
 
    CGContextSaveGState (context);              // 27
    CGContextTranslateCTM (context, start_x, start_y);      // 28
    for (j=0; j< num_six_star_rows;  j++)   // 29
    {
        for (i=0; i< 6;  i++)
        {
            CGContextDrawLayerAtPoint (context,CGPointZero,
                                            starLayer);// 30
            CGContextTranslateCTM (context, h_spacing, 0);// 31
        }
        CGContextTranslateCTM (context, (-i*h_spacing), v_spacing); // 32
    }
    CGContextRestoreGState(context);
 
    CGContextSaveGState(context);
    CGContextTranslateCTM (context, start_x + h_spacing/2, // 33
                                 start_y + v_spacing/2);
    for (j=0; j< num_five_star_rows;  j++)  // 34
    {
        for (i=0; i< 5;  i++)
        {
        CGContextDrawLayerAtPoint (context, CGPointZero,
                            starLayer);// 35
            CGContextTranslateCTM (context, h_spacing, 0);// 36
        }
        CGContextTranslateCTM (context, (-i*h_spacing), v_spacing);// 37
    }
    CGContextRestoreGState(context);
 
    CGLayerRelease(stripeLayer);// 38
    CGLayerRelease(starLayer);        // 39
}

下面是代碼的作用:

1、為第一顆恒星的水平位置聲明一個(gè)變量。
2、為第一顆恒星的垂直位置聲明一個(gè)變量。
3、聲明一個(gè)變量,用于標(biāo)記上的紅色條紋之間的間距。
4、聲明一個(gè)變量,表示國(guó)旗上星星之間的水平間距。
5、聲明一個(gè)變量,表示國(guó)旗上星星的垂直間距。
6、聲明指定將標(biāo)志繪制到(邊框)、條形層和星形字段的位置的矩形。
7、聲明一個(gè)點(diǎn)數(shù)組,該數(shù)組指定跟蹤某顆星的線。
8、創(chuàng)建一個(gè)單個(gè)條紋形狀的矩形。
9、創(chuàng)建一個(gè)矩形,它是星域的形狀。
10、創(chuàng)建一個(gè)與傳遞給myDrawFlag例程的窗口圖形上下文大小相同的邊框。
11、創(chuàng)建一個(gè)用傳遞給myDrawFlag例程的窗口圖形上下文初始化的層。
12、獲取與該層關(guān)聯(lián)的圖形上下文。您將使用這個(gè)圖層來(lái)繪制條紋圖。
13、為與條紋層相關(guān)聯(lián)的圖形上下文設(shè)置填充顏色為不透明紅色。
14、填充表示一條紅色條紋的矩形。
15、創(chuàng)建另一個(gè)層,該層使用傳遞給myDrawFlag例程的窗口圖形上下文初始化。
16、獲取與該層關(guān)聯(lián)的圖形上下文。你將使用這個(gè)圖層來(lái)繪制星圖。
17、為與星形層相關(guān)聯(lián)的圖形上下文設(shè)置填充色為不透明白色。
18、將myStarPoints數(shù)組定義的10行添加到與星層關(guān)聯(lián)的上下文。
19、填充路徑,該路徑由剛剛添加的10行組成。
20、保存windows圖形上下文的圖形狀態(tài)。您需要這樣做,因?yàn)槟鷮⒃诓煌奈恢弥貜?fù)地繪制相同的條帶。
21、設(shè)置一個(gè)循環(huán),該循環(huán)迭代7次,每次迭代用于標(biāo)記上的每個(gè)紅色條帶。
22、繪制條紋層(由單個(gè)紅色條紋組成)。
23、轉(zhuǎn)換當(dāng)前變換矩陣,使原點(diǎn)位于必須繪制下一條紅色條紋的位置。
24、將圖形狀態(tài)恢復(fù)到繪制條紋之前的狀態(tài)。
25、設(shè)置星域的填充色為適當(dāng)?shù)乃{(lán)色陰影。注意,這種顏色的不透明度是1.0。雖然本例中的所有顏色都是不透明的,但它們不需要是透明的。通過(guò)使用部分透明的顏色,你可以通過(guò)分層繪制創(chuàng)建漂亮的效果。回想一下,alpha值為0.0指定了透明顏色。
26、用藍(lán)色填充星域矩形。將這個(gè)矩形直接繪制到窗口圖形上下文。如果你只畫(huà)一次東西,不要使用圖層。
27、為窗口圖形上下文保存圖形狀態(tài),因?yàn)槟鷮⑥D(zhuǎn)換CTM以正確定位星形。
28、翻譯CTM,使原點(diǎn)位于星域,定位在第一(底部)行中的第一顆星(左邊)。
29、這個(gè)循環(huán)和下一個(gè)for循環(huán)將設(shè)置代碼來(lái)重復(fù)繪制星號(hào)層,以便標(biāo)記上的5個(gè)奇數(shù)行包含6個(gè)星號(hào)。
30、將星形層繪制到窗口圖形上下文。回想一下,星層包含一顆白星。
31、定位CTM,使原點(diǎn)移動(dòng)到右邊,為繪制下一個(gè)恒星做準(zhǔn)備。
32、定位CTM,使原點(diǎn)向上移動(dòng),為繪制下一行恒星做準(zhǔn)備。
33、翻譯CTM,使原點(diǎn)位于星場(chǎng),定位在從底部第二排的第一顆星(左邊)。注意,偶數(shù)行相對(duì)于奇數(shù)行是偏移的。
34、這個(gè)循環(huán)和下一個(gè)for循環(huán)將設(shè)置代碼來(lái)重復(fù)繪制星號(hào)層,以便標(biāo)記上的4行偶數(shù)都包含5顆星。
35、將星形層繪制到窗口圖形上下文。
36、定位CTM,使原點(diǎn)移動(dòng)到右邊,為繪制下一個(gè)恒星做準(zhǔn)備。
37、放置CTM,使原點(diǎn)向下和向左,為繪制下一行恒星做準(zhǔn)備。
38、釋放條紋層。
39、發(fā)布明星層。

最后編輯于
?著作權(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閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374