Android 曲線圖 繪制曲線

Android 曲線圖
Paste_Image.png
這里我引用了上回介紹的 折線圖

首先我們看看onDrwa 里面做了什么 從圖里面我們可看到 繪制的框線方法懦窘,繪制data線方法 繪制線上的圓

從最上面的圖效果來看我們不需要圓 也不需要折線尸执,但是框線要保留 因此我們需要 把
這個幾個方法 改成public 蠕蚜,到時候繼承之后重寫他 不調(diào)用父方法即可


Paste_Image.png
Paste_Image.png

接下來我們創(chuàng)建一個 類繼承 DrawLineChart 重寫 DrawLineCircle矫户,DrawLine 方法

這樣我們就保留 了框線爽锥, 取消了圓和折線的繪制

接下來在DrawLine 里面繪制曲線

<code>

@Override
public void DrawLine(Canvas canvas) {
    Path mPath=new Path();
     for(int j = 0; j < mPoints.length; j++) {
         Point startp = mPoints[j];
         Point endp;
         if (j != mPoints.length - 1) {
             endp = mPoints[j + 1];
             int wt = (startp.x + endp.x) / 2;
             Point p3 = new Point();
             Point p4 = new Point();
             p3.y = startp.y;
             p3.x = wt;
             p4.y = endp.y;
             p4.x = wt;
             if (j == 0) {
                 mPath.moveTo(startp.x, startp.y);
             }
             /**
              *添加一個立方貝塞爾曲線的最后一點,接近控制點
              *(x1,y1)和(x2,y2),到最后(x3,y3)绪颖。如果沒有移至()調(diào)用
              *為這個輪廓,第一點是自動設(shè)置為(0,0)锚贱。
              *
              * @param x1的坐標(biāo)1立方曲線控制點
              * @param y1第一控制點的坐標(biāo)一立方曲線
              * @param x2上第二個控制點的坐標(biāo)一立方曲線
              * @param y2第二控制點的坐標(biāo)一立方曲線
              * @param x3的坐標(biāo)三次曲線的終點
              * @param y3終點坐標(biāo)的三次曲線
              *
              */
             mPath.cubicTo(p3.x, p3.y, p4.x, p4.y, endp.x, endp.y);
         }
         
     }
    /**這里直接使用了折線的畫筆,你也可以在此類在定義一個畫筆*/
    canvas.drawPath(mPath,getBrokenLinePaint());
}

</code>

什么吆寨, 你不光要曲線赏淌,。 還要填充式的怎么辦啄清,這個時候你就需要將你的曲線連接起來 起點到終點連接起來 將畫筆Style 改為FILL 六水,怎么連? 看圖辣卒,從圖上 我們可以看到
  • 終點x,終點y 連接到 終點x,底部y
  • 終點x,底部y 連接到 起點x,底部y
  • 起點x 底部y 連接到 起點x,起點y
Paste_Image.png
  • 根據(jù)上面的分析 我們代碼 就是這樣的了

<code>

@Override
public void DrawLine(Canvas canvas) {
    Path mPath=new Path();
     for(int j = 0; j < mPoints.length; j++) {
         Point startp = mPoints[j];
         Point endp;
         if (j != mPoints.length - 1) {
             endp = mPoints[j + 1];
             int wt = (startp.x + endp.x) / 2;
             Point p3 = new Point();
             Point p4 = new Point();
             p3.y = startp.y;
             p3.x = wt;
             p4.y = endp.y;
             p4.x = wt;
             if (j == 0) {
                 mPath.moveTo(startp.x, startp.y);
             }
             /**
              *添加一個立方貝塞爾曲線的最后一點,接近控制點
              *(x1,y1)和(x2,y2),到最后(x3,y3)掷贾。如果沒有移至()調(diào)用
              *為這個輪廓,第一點是自動設(shè)置為(0,0)。
              *
              * @param x1的坐標(biāo)1立方曲線控制點
              * @param y1第一控制點的坐標(biāo)一立方曲線
              * @param x2上第二個控制點的坐標(biāo)一立方曲線
              * @param y2第二控制點的坐標(biāo)一立方曲線
              * @param x3的坐標(biāo)三次曲線的終點
              * @param y3終點坐標(biāo)的三次曲線
              *
              */
             mPath.cubicTo(p3.x, p3.y, p4.x, p4.y, endp.x, endp.y);
         }else {
             /**連接到終點x,底部y*/
             mPath.lineTo(startp.x,getNeedDrawHeight()+getBrokenLineTop());
             /**連接到起點x,底部y*/
             mPath.lineTo(mPoints[0].x,getNeedDrawHeight()+getBrokenLineTop());
             /**連接到起點x,起點y*/
             mPath.lineTo(mPoints[0].x,mPoints[0].y);
         }
     }
    Paint paint=getBrokenLinePaint();
    /**修改畫筆屬性*/
    paint.setStyle(Paint.Style.FILL);
    canvas.drawPath(mPath,getBrokenLinePaint());
}

</code>

  • 效果圖
Paste_Image.png
完整代碼

<code>

package com.app_chart;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.support.annotation.Nullable;
import android.util.AttributeSet;


public class CurveChart extends  DrawLineChart {
    public CurveChart(Context context) {
        super(context);
    }

    public CurveChart(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void DrawLineCircle(Canvas canvas) {

    }

    @Override
    public void DrawLine(Canvas canvas) {
        Path mPath=new Path();
         for(int j = 0; j < mPoints.length; j++) {
             Point startp = mPoints[j];
             Point endp;
             if (j != mPoints.length - 1) {
                 endp = mPoints[j + 1];
                 int wt = (startp.x + endp.x) / 2;
                 Point p3 = new Point();
                 Point p4 = new Point();
                 p3.y = startp.y;
                 p3.x = wt;
                 p4.y = endp.y;
                 p4.x = wt;
                 if (j == 0) {
                     mPath.moveTo(startp.x, startp.y);
                 }
                 /**
                  *添加一個立方貝塞爾曲線的最后一點,接近控制點
                  *(x1,y1)和(x2,y2),到最后(x3,y3)荣茫。如果沒有移至()調(diào)用
                  *為這個輪廓,第一點是自動設(shè)置為(0,0)想帅。
                  *
                  * @param x1的坐標(biāo)1立方曲線控制點
                  * @param y1第一控制點的坐標(biāo)一立方曲線
                  * @param x2上第二個控制點的坐標(biāo)一立方曲線
                  * @param y2第二控制點的坐標(biāo)一立方曲線
                  * @param x3的坐標(biāo)三次曲線的終點
                  * @param y3終點坐標(biāo)的三次曲線
                  *
                  */
                 mPath.cubicTo(p3.x, p3.y, p4.x, p4.y, endp.x, endp.y);
             }else {
                 /**連接到終點x,底部y*/
                 mPath.lineTo(startp.x,getNeedDrawHeight()+getBrokenLineTop());
                 /**連接到起點x,底部y*/
                 mPath.lineTo(mPoints[0].x,getNeedDrawHeight()+getBrokenLineTop());
                 /**連接到起點x,起點y*/
                 mPath.lineTo(mPoints[0].x,mPoints[0].y);
             }
         }
        Paint paint=getBrokenLinePaint();
        /**修改畫筆屬性*/
        paint.setStyle(Paint.Style.FILL);
        canvas.drawPath(mPath,getBrokenLinePaint());
    }
}

</code>

Activity 調(diào)用
Paste_Image.png
DrawLineChart 代碼

<code>

package com.app_chart;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import java.text.DecimalFormat;

public class DrawLineChart extends View {
    private static final String TAG = "DrawLineChart";
    /**View寬度*/
    private int mViewWidth;
    /** View高度*/
    private int mViewHeight;
    /**邊框線畫筆*/
    private Paint mBorderLinePaint;
    /**文本畫筆*/
    private Paint mTextPaint;
    /**要繪制的折線線畫筆*/
    private Paint mBrokenLinePaint;
    /**折線文本畫筆*/
    private Paint mBrokenLineTextPaint;
    /**圓畫筆*/
    private Paint mCirclePaint;
    /**橫線畫筆*/
    private Paint mHorizontalLinePaint;
    /**圓的厚度*/
    private float mCircleWidth=2;
    /**圓的半徑*/
    private float radius=5;
    /**邊框的左邊距*/
    private float mBrokenLineLeft=dip2px(30);
    /**邊框的上邊距*/
    private float mBrokenLineTop=dip2px(10);
    /**邊框的下邊距*/
    private float mBrokenLineBottom=dip2px(20);
    /**邊框的右邊距*/
    private float mBrokenLinerRight=dip2px(10);
    /**需要繪制的寬度*/
    private float mNeedDrawWidth;
    /**需要繪制的高度*/
    private float mNeedDrawHeight;
    /**數(shù)據(jù)值*/
    private float[] value=new float[]{-5.55f,-6.899f,-4.55f,-0.045f,21.511f,22.221f,22.330f,21.448f,21.955f,23.6612f,22,22.18883f,21.47995f};
    /**圖表的最大值*/
    private float maxVlaue=27.55f;
    /**圖表的最小值*/
    private float minValue=-19.12f;
    /**要計算的總值*/
    private float calculateValue;
    /**框線平均值*/
    private float averageValue;
    /**橫線數(shù)量*/
    private float numberLine=5;
    /**邊框線顏色*/
    private int mBorderLineColor=Color.BLACK;
    /**邊框線的寬度*/
    private  int mBorderWidth=2;
    /**邊框文本顏色*/
    private int mBorderTextColor=Color.GRAY;
    /**邊框文本大小*/
    private float mBorderTextSize=20;
    /**邊框橫線顏色*/
    private int mBorderTransverseLineColor=Color.GRAY;
    /**邊框橫線寬度*/
    private float mBorderTransverseLineWidth=2;
    /**折線顏色*/
    private int mBrokenLineColor=Color.BLUE;
    /**折線文本顏色*/
    private  int mBrokenLineTextColor=Color.BLUE;
    /**折線寬度*/
    private  float mBrokenLineWidth=2;
    /**折線文本大小*/
    private  float mBrokenLineTextSize=15;
    /**折線圓的顏色*/
    private int mCircleColor=Color.BLUE;
    /**計算后的x,y坐標(biāo)*/
    public Point[] mPoints;
    /**圓的半徑*/
    public void setRadius(float radius) {
        this.radius = dip2px(radius);
    }
    /**設(shè)置寬度*/
    public  void  setCircleWidth(float circleWidth){
        this.mCircleWidth=dip2px(circleWidth);
    }
    /**設(shè)置邊框左上右下邊距*/
    public  void  setBrokenLineLTRB(float l,float t,float  r,float b){
        mBrokenLineLeft=dip2px(l);
        mBrokenLineTop=dip2px(t);
        mBrokenLinerRight=dip2px(r);
        mBrokenLineBottom=dip2px(b);
    }

    public int getViewWidth() {
        return mViewWidth;
    }

    public int getViewHeight() {
        return mViewHeight;
    }

    public float getCircleWidth() {
        return mCircleWidth;
    }

    public float getRadius() {
        return radius;
    }

    public float getBrokenLineLeft() {
        return mBrokenLineLeft;
    }

    public float getBrokenLineTop() {
        return mBrokenLineTop;
    }

    public float getBrokenLineBottom() {
        return mBrokenLineBottom;
    }

    public float getBrokenLinerRight() {
        return mBrokenLinerRight;
    }

    public float getNeedDrawWidth() {
        return mNeedDrawWidth;
    }

    public float getNeedDrawHeight() {
        return mNeedDrawHeight;
    }

    public Point[] getPoints() {
        return mPoints;
    }

    /**數(shù)據(jù)data*/
    public void setValue(float[] value) {
        this.value = value;
    }
    /**圖表顯示最大值*/
    public void setMaxVlaue(float maxVlaue) {
        this.maxVlaue = maxVlaue;
    }
    /**圖表顯示最小值*/
    public void setMinValue(float minValue) {
        this.minValue = minValue;
    }
    /**圖表橫線數(shù)量*/
    public void setNumberLine(float numberLine) {
        this.numberLine = numberLine;
    }
    /**邊框線顏色*/
    public void setBorderLineColor(int borderLineColor) {
        mBorderLineColor = borderLineColor;
    }
    /**邊框文本顏色*/
    public void setBorderTextColor(int borderTextColor) {
        mBorderTextColor = borderTextColor;
    }
    /**邊框文本大小*/
    public void setBorderTextSize(float borderTextSize) {
        mBorderTextSize = dip2px(borderTextSize);
    }
    /**框線橫線 顏色*/
    public void setBorderTransverseLineColor(int borderTransverseLineColor) {
        mBorderTransverseLineColor = borderTransverseLineColor;
    }
    /**邊框內(nèi)折線顏色*/
    public void setBrokenLineColor(int brokenLineColor) {
        mBrokenLineColor = brokenLineColor;
    }
    /** 折線文本顏色*/
    public void setBrokenLineTextColor(int brokenLineTextColor) {
        mBrokenLineTextColor = brokenLineTextColor;
    }
    /**折線文本大小*/
    public void setBrokenLineTextSize(float brokenLineTextSize) {
        mBrokenLineTextSize = dip2px(brokenLineTextSize);
    }
    /**折線圓顏色*/
    public void setCircleColor(int circleColor) {
        mCircleColor = dip2px(circleColor);
    }
    /**邊框線寬度*/
    public void setBorderWidth(float borderWidth) {
        mBorderWidth = dip2px(borderWidth);
    }
    /**邊框橫線寬度*/
    public void setBorderTransverseLineWidth(float borderTransverseLineWidth) {
        mBorderTransverseLineWidth = dip2px(borderTransverseLineWidth);
    }
    /**折線寬度*/
    public void setBrokenLineWidth(float brokenLineWidth) {
        mBrokenLineWidth = dip2px(brokenLineWidth);
    }

    /**獲取框線畫筆*/
    public Paint getBorderLinePaint() {
        return mBorderLinePaint;
    }

    /**獲取邊框文本畫筆*/
    public Paint getTextPaint() {
        return mTextPaint;
    }

    /**獲取折線畫筆*/
    public Paint getBrokenLinePaint() {
        return mBrokenLinePaint;
    }

    /**獲取折線文本畫筆*/
    public Paint getBrokenLineTextPaint() {
        return mBrokenLineTextPaint;
    }

    /**獲取圓畫筆*/
    public Paint getCirclePaint() {
        return mCirclePaint;
    }

    /**獲取邊框橫線畫筆*/
    public Paint getHorizontalLinePaint() {
        return mHorizontalLinePaint;
    }

    /**
     * 將dip或dp值轉(zhuǎn)換為px值啡莉,保證尺寸大小不變
     *
     * @param dipValue
     * @return
     */
    private  int dip2px( float dipValue) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    public DrawLineChart(Context context) {
        super(context);
        initPaint();

    }

    public DrawLineChart(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initPaint();

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mViewHeight = getMeasuredHeight();
        mViewWidth = getMeasuredWidth();

        /**計算總值*/
        calculateValue=maxVlaue-minValue;

        initNeedDrawWidthAndHeight();

        /**計算框線橫線間隔的數(shù)據(jù)平均值*/
        averageValue = calculateValue/(numberLine-1);

    }


    /**初始化繪制折線圖的寬高*/
    private void initNeedDrawWidthAndHeight(){
        mNeedDrawWidth = mViewWidth-mBrokenLineLeft-mBrokenLinerRight;
        mNeedDrawHeight = mViewHeight-mBrokenLineTop-mBrokenLineBottom;
    }
    /**初始化畫筆*/
    private void initPaint() {

        /**初始化邊框文本畫筆*/
        if(mTextPaint==null){
            mTextPaint=new Paint();
            initPaint(mTextPaint);
        }
        mTextPaint.setTextSize(mBorderTextSize);
        mTextPaint.setTextAlign(Paint.Align.RIGHT);
        mTextPaint.setColor(Color.GRAY);
        /**初始化邊框線畫筆*/
        if(mBorderLinePaint==null){
            mBorderLinePaint=new Paint();
            initPaint(mBorderLinePaint);
        }

        mBorderLinePaint.setTextSize(mBorderTextSize);
        mBorderLinePaint.setStrokeWidth(mBorderWidth);
        mBorderLinePaint.setColor(mBorderLineColor);

        /**初始化折線畫筆*/
        if(mBrokenLinePaint==null){
            mBrokenLinePaint=new Paint();
            initPaint(mBrokenLinePaint);

        }

        mBrokenLinePaint.setStrokeWidth(mBrokenLineWidth);
        mBrokenLinePaint.setColor(mBrokenLineColor);

        if(mCirclePaint==null){
            mCirclePaint=new Paint();
            initPaint(mCirclePaint);
        }
        mCirclePaint.setStrokeWidth(mCircleWidth);
        mCirclePaint.setColor(mCircleColor);

        /**折線文本畫筆*/
        if (mBrokenLineTextPaint == null){
            mBrokenLineTextPaint=new Paint();
            initPaint(mBrokenLineTextPaint);
        }
        mBrokenLineTextPaint.setTextAlign(Paint.Align.CENTER);
        mBrokenLineTextPaint.setColor(mBrokenLineTextColor);
        mBrokenLineTextPaint.setTextSize(mBrokenLineTextSize);

        /**橫線畫筆*/
        if (mHorizontalLinePaint == null){
            mHorizontalLinePaint=new Paint();
            initPaint(mHorizontalLinePaint);
        }

        mHorizontalLinePaint.setStrokeWidth(mBorderTransverseLineWidth);
        mHorizontalLinePaint.setColor(mBorderTransverseLineColor);
    }

    /**初始化畫筆默認(rèn)屬性*/
    private void initPaint(Paint paint){
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPoints = getPoints(value,mNeedDrawHeight,mNeedDrawWidth,calculateValue,minValue,mBrokenLineLeft,mBrokenLineTop);
        /**繪制邊框線和邊框文本*/
        DrawBorderLineAndText(canvas);
        /**根據(jù)數(shù)據(jù)繪制線*/
        DrawLine(canvas);
        /**繪制圓*/
        DrawLineCircle(canvas);

    }
    /**繪制線上的圓*/
    public void DrawLineCircle(Canvas canvas) {
        for (int i = 0; i <mPoints.length ; i++) {
            Point point=mPoints[i];
            mCirclePaint.setColor(Color.WHITE);
            mCirclePaint.setStyle(Paint.Style.FILL);
            canvas.drawCircle(point.x,point.y,radius,mCirclePaint);

            mCirclePaint.setColor(mCircleColor);
            mCirclePaint.setStyle(Paint.Style.STROKE);
            /**
             * drawCircle(float cx, float cy, float radius, Paint paint)
             * cx 中間x坐標(biāo)
             * xy 中間y坐標(biāo)
             * radius 圓的半徑
             * paint 繪制圓的畫筆
             * */
            canvas.drawCircle(point.x,point.y,radius,mCirclePaint);
        }
    }

    /**根據(jù)值繪制折線*/
    public void DrawLine(Canvas canvas) {
        Path mPath=new Path();
        for (int i = 0; i < mPoints.length; i++) {
            Point point=mPoints[i];
            if(i==0){
                mPath.moveTo(point.x,point.y);
            }else {
                mPath.lineTo(point.x,point.y);
            }
            canvas.drawText(value[i]+"",point.x,point.y-radius,mBrokenLineTextPaint);
        }
        canvas.drawPath(mPath,mBrokenLinePaint);
    }

    /**繪制邊框線和邊框文本*/
    private void DrawBorderLineAndText(Canvas canvas) {
        /**對應(yīng)的屬性
         * drawLine(float startX, float startY, float stopX, float stopY, Paint paint);
         * startX   開始的x坐標(biāo)
         * startY   開始的y坐標(biāo)
         * stopX    結(jié)束的x坐標(biāo)
         * stopY    結(jié)束的y坐標(biāo)
         * paint    繪制該線的畫筆
         * */

        /**繪制邊框豎線*/
        canvas.drawLine(mBrokenLineLeft,mBrokenLineTop-dip2px(5),mBrokenLineLeft,mViewHeight-mBrokenLineBottom,mBorderLinePaint);
        /**繪制邊框橫線*/
        canvas.drawLine(mBrokenLineLeft,mViewHeight-mBrokenLineBottom,mViewWidth,mViewHeight-mBrokenLineBottom,mBorderLinePaint);


        /**繪制邊框分段橫線與分段文本*/
        float averageHeight=mNeedDrawHeight/(numberLine-1);

        for (int i = 0; i < numberLine; i++) {
            float nowadayHeight= averageHeight*i;
            float v=averageValue*(numberLine-1-i)+minValue;

            /**最后橫線無需繪制港准,否則會將邊框橫線覆蓋*/
            if(i!=numberLine-1) {
                canvas.drawLine(mBrokenLineLeft, nowadayHeight + mBrokenLineTop, mViewWidth, nowadayHeight + mBrokenLineTop, mHorizontalLinePaint);
            }
            canvas.drawText(floatKeepTwoDecimalPlaces(v)+"",mBrokenLineLeft-dip2px(2),nowadayHeight+mBrokenLineTop,mTextPaint);
        }

        /**豎線*/
        for (int i = 1; i < mPoints.length; i++) {
            //canvas.drawLine(mPoints[i].x,mBrok enLineTop,mPoints[i].x,mBrokenLineTop+mNeedDrawHeight,mBorderLinePaint);
        }
    }
    /**保留2位小數(shù)*/
    private String  floatKeepTwoDecimalPlaces(float f){
        DecimalFormat decimalFormat=new DecimalFormat("0.00");//構(gòu)造方法的字符格式這里如果小數(shù)不足2位,會以0補足.
        String p=decimalFormat.format(f);
        return p;
    }


    /**根據(jù)值計算在該值的 x旨剥,y坐標(biāo)*/
    public Point[] getPoints(float[] values, float height, float width, float max ,float min, float left,float top) {
        float leftPading = width / (values.length-1);//繪制邊距
        Point[] points = new Point[values.length];
        for (int i = 0; i < values.length; i++) {
            double value = values[i]-min;
            //計算每點高度所以對應(yīng)的值
            double mean = (double) max/height;
            //獲取要繪制的高度
            float drawHeight = (float) (value / mean);
            int pointY = (int) (height+top  - drawHeight);
            int pointX = (int) (leftPading * i + left);
            Point point = new Point(pointX, pointY);
            points[i] = point;
        }
        return points;
    }
}

</code>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叉趣,隨后出現(xiàn)的幾起案子泞边,更是在濱河造成了極大的恐慌,老刑警劉巖疗杉,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵谚,死亡現(xiàn)場離奇詭異,居然都是意外死亡烟具,警方通過查閱死者的電腦和手機(jī)梢什,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝聋,“玉大人嗡午,你說我怎么就攤上這事〖胶郏” “怎么了荔睹?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長言蛇。 經(jīng)常有香客問我僻他,道長,這世上最難降的妖魔是什么腊尚? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任吨拗,我火速辦了婚禮,結(jié)果婚禮上婿斥,老公的妹妹穿的比我還像新娘劝篷。我一直安慰自己,他們只是感情好民宿,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布娇妓。 她就那樣靜靜地躺著,像睡著了一般勘高。 火紅的嫁衣襯著肌膚如雪峡蟋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天华望,我揣著相機(jī)與錄音,去河邊找鬼仅乓。 笑死赖舟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夸楣。 我是一名探鬼主播宾抓,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼子漩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了石洗?” 一聲冷哼從身側(cè)響起幢泼,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讲衫,沒想到半個月后缕棵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡涉兽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年招驴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枷畏。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡别厘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拥诡,到底是詐尸還是另有隱情触趴,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布渴肉,位于F島的核電站冗懦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宾娜。R本人自食惡果不足惜批狐,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望前塔。 院中可真熱鬧嚣艇,春花似錦、人聲如沸华弓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂屏。三九已至贰谣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迁霎,已是汗流浹背吱抚。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留考廉,地道東北人秘豹。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像昌粤,于是被迫代替她去往敵國和親既绕。 傳聞我的和親對象是個殘疾皇子啄刹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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