Android存儲密碼項目備忘錄

好吧這一段時間確實沒有好好的敲代碼了,深深的罪惡感啊,準(zhǔn)備這周搞一下在guihub上看到的一個密碼應(yīng)用PassWord,準(zhǔn)備把這個仿寫完成的,主要為了熟悉一些現(xiàn)在熱門但在現(xiàn)在公司項目上用不到的東東.

知識點 |

  1. Android手勢解鎖 |
  2. Realm數(shù)據(jù)庫的使用 |
  3. MVP架構(gòu)的搭建 |
  4. 一些5.0的控件使用 |
  5. 自定義控件 |

1.Android手勢解鎖


昨天看了一下鴻洋之前寫的手勢解鎖控件的實現(xiàn),膜拜一下,感覺自己的代碼量太少需要大大加強啊.好了廢話不多說了,直接看實現(xiàn),這里主要就是自定義view和畫圖兩個方面的東東.

整個解鎖的界面構(gòu)成包括兩個部分,解鎖的圓,以及手指劃過時的線兩個部分,圓的構(gòu)成包括兩個部分外圈的空心圓以及內(nèi)圈的實心圓,然后圓的狀態(tài)包括三個部分正常未按下,按下,手指抬起主要是顏色的變化.

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

/**
 * 手勢解鎖中單個圓的view
 * Created by apple on 16/6/20.
 */
    public class GestureLockView extends View {
    private static final String TAG = "GestureLockView";

    //觸摸點的三種狀態(tài)
    enum Mode {
        STATUS_NO_FINGER, STATUS_FINGER_ON, STATUS_FINGER_UP;
    }

    //初始狀態(tài)
    private Mode mCurrentStatus = Mode.STATUS_NO_FINGER;
    //圓的寬高
    private int mWidth;
    private int mHeight;
    //圓的半徑
    private int mRadius;
    //畫筆的寬度
    private int mStrokeWidth = 2;
    //圓的中心坐標(biāo)點
    private int mCenterX, mCenterY;
    private Paint mPaint;

    /**
     * 箭頭(小三角最長邊的一半長度 = mArrawRate * mWidth / 2 )
     */
    private float mArrowRate = 0.333f;
    private int mArrowDegree = -1;
    private Path mArrowPath;
    /**
     * 內(nèi)圓的半徑 = mInnerCircleRadiusRate * mRadus
     */
    private float mInnerCircleRadiusRate = 0.3F;

    /**
     * 四個顏色仅乓,可由用戶自定義夸楣,初始化時由GestureLockViewGroup傳入
     */
    private int mColorNoFingerInner;
    private int mColorNoFingerOutter;
    private int mColorFingerOn;
    private int mColorFingerUp;

    public GestureLockView(Context context) {
        super(context);
    }

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

    public GestureLockView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public GestureLockView(Context context, int colorNoFingerInner, int colorNoFingerOutter, int colorFingerOn, int colorFingerUp) {
        super(context);
        mColorFingerOn = colorFingerOn;
        mColorFingerUp = colorFingerUp;
        mColorNoFingerInner = colorNoFingerInner;
        mColorNoFingerOutter = colorNoFingerOutter;
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //path 一個路徑類
        mArrowPath = new Path();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = MeasureSpec.getSize(widthMeasureSpec);
        mHeight = MeasureSpec.getSize(heightMeasureSpec);
        //圓的邊框為正方形,取兩個最小的
        mWidth = mWidth < mHeight ? mWidth : mHeight;
        //獲取圓的半徑和圓點坐標(biāo)
        mRadius = mCenterX = mCenterY = mWidth / 2;
        //減去畫筆的寬度
        mRadius -= mStrokeWidth;
        //默認的三角位置為圓的正上方向上的剪頭,然后根據(jù)兩個GestureLockView來進行角度的旋轉(zhuǎn)
        //確定位置以及確定圓的path路徑
        float mArrowLength = mWidth / 2 * mArrowRate;
        mArrowPath.moveTo(mWidth / 2, mStrokeWidth + 2);//移動到線的起始點
        mArrowPath.lineTo(mWidth / 2 - mArrowLength, mStrokeWidth + mArrowLength + 2);//從原點到這個點劃線
        mArrowPath.lineTo(mWidth / 2 + mArrowLength, mStrokeWidth + mArrowLength + 2);
        mArrowPath.close();
        mArrowPath.setFillType(Path.FillType.WINDING);//設(shè)置填充類型
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //根據(jù)不同的狀態(tài)畫圓
        switch (mCurrentStatus) {
            case STATUS_FINGER_ON:
                //按下時畫圓
                //繪制外圓
                mPaint.setColor(mColorFingerOn);
                mPaint.setStyle(Paint.Style.STROKE);//只有邊線
                mPaint.setStrokeWidth(2);
                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);
                //繪制內(nèi)圓
                mPaint.setStyle(Paint.Style.FILL);
                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);
                break;
            case STATUS_FINGER_UP:
                //手指抬起時
                mPaint.setColor(mColorFingerUp);
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setStrokeWidth(2);
                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);
                mPaint.setStyle(Paint.Style.FILL);
                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);
                drawArrow(canvas);
                break;
            case STATUS_NO_FINGER:
                //沒有按下的狀態(tài)
                //繪制外圓
                mPaint.setStyle(Paint.Style.FILL);//完全填充
                mPaint.setColor(mColorNoFingerOutter);
                canvas.drawCircle(mCenterX, mCenterY, mRadius, mPaint);
                //繪制內(nèi)圓
                mPaint.setColor(mColorNoFingerInner);
                canvas.drawCircle(mCenterX, mCenterY, mRadius * mInnerCircleRadiusRate, mPaint);
                break;
        }
    }

    /**
     * 繪制剪頭
     * canvas的save和restore的作用
     * 這兩個是成對出現(xiàn)的 save 可以保存當(dāng)前canvas上以有的狀態(tài)
     * 一般我們需要是對某個特定元素進行旋轉(zhuǎn)等操作,而這個操作又不想對其他的元素有影響,那么就可以使用這個
     * restore就可以取出之前保存的狀態(tài)
     */
    private void drawArrow(Canvas canvas){
        if(mArrowDegree != -1){
            mPaint.setStyle(Paint.Style.FILL);
            canvas.save();
            canvas.rotate(mArrowDegree,mCenterX,mCenterY);//畫布旋轉(zhuǎn)
            canvas.drawPath(mArrowPath,mPaint);//繪制路徑,這里其實繪制兩條線,不過因為畫筆模式為完全填充,所以就構(gòu)建成了一個三角形
            canvas.restore();
        }
    }

    /**
     * 設(shè)置當(dāng)前的模式并進行重新繪制
     */
    public void setMode(Mode mode){
        mCurrentStatus = mode;
        invalidate();
    }

    /**
     * 設(shè)置剪頭的角度
     * @param degree
     */
    public void setmArrowDegree(int degree){
        mArrowDegree = degree;
    }

    public int getmArrowDegree(){
        return mArrowDegree;
    }
 }

然后是整體的布局,這里使用了自定義熟悉來設(shè)置一些參數(shù),包括上面的顏色以及每行的個數(shù),這里每行的個數(shù)和列是相互對應(yīng)的,就是3*3,然后還有重試次數(shù).自定義屬性


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.List;


/**
 * 抄的洪洋的手勢解鎖,這里有一個問題就是圖像最開始的一個坐標(biāo)點是從0開始的
 * Created by apple on 16/6/20.
 */
public class GestureLockViewGroup extends RelativeLayout {

    private static final String TAG = "GestureLockViewGroup";
    //所有的點view
    private GestureLockView[] mGestureLockViews;

    private int mCount = 4;
    //答案
    private int[] mAnswer = {1, 2,3, 6, 7};
    //被選中的圖像id
    private List<Integer> mChoose = new ArrayList<>();
    private Paint mPaint;
    /**
     * 每個GestureLockView中間的間距 設(shè)置為:mGestureLockViewWidth * 25%
     */
    private int mMarginBetweenLockView = 30;
    /**
     * GestureLockView的邊長 4 * mWidth / ( 5 * mCount + 1 )
     */
    private int mGestureLockViewWidth;

    /**
     * GestureLockView無手指觸摸的狀態(tài)下內(nèi)圓的顏色
     */
    private int mNoFingerInnerCircleColor = 0xFF939090;
    /**
     * GestureLockView無手指觸摸的狀態(tài)下外圓的顏色
     */
    private int mNoFingerOuterCircleColor = 0xFFE0DBDB;
    /**
     * GestureLockView手指觸摸的狀態(tài)下內(nèi)圓和外圓的顏色
     */
    private int mFingerOnColor = 0xFF378FC9;
    /**
     * GestureLockView手指抬起的狀態(tài)下內(nèi)圓和外圓的顏色
     */
    private int mFingerUpColor = 0xFFFF0000;

    /**
     * 寬度
     */
    private int mWidth;
    /**
     * 高度
     */
    private int mHeight;

    private Path mPath;
    /**
     * 指引線的開始位置x
     */
    private int mLastPathX;
    /**
     * 指引線的開始位置y
     */
    private int mLastPathY;
    /**
     * 指引下的結(jié)束位置
     */
    private Point mTmpTarget = new Point();

    /**
     * 最大嘗試次數(shù)
     */
    private int mTryTimes = 4;
    /**
     * 回調(diào)接口
     */
    private OnGestureLockViewListener mOnGestureLockViewListener;

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

    public GestureLockViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //獲取自定義屬性的值
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.GestureLockViewGroup, defStyleAttr, 0);

        int count = typedArray.getIndexCount();
        for (int a = 0; a < count; a++) {
            int index = typedArray.getIndex(a);
            switch (index) {
                case R.styleable.GestureLockViewGroup_color_finger_on:
                    mFingerOnColor = typedArray.getColor(a, mFingerOnColor);
                    break;
                case R.styleable.GestureLockViewGroup_color_finger_up:
                    mFingerUpColor = typedArray.getColor(a, mFingerUpColor);
                    break;
                case R.styleable.GestureLockViewGroup_color_no_finger_inner_circle:
                    mNoFingerInnerCircleColor = typedArray.getColor(a, mNoFingerInnerCircleColor);
                    break;
                case R.styleable.GestureLockViewGroup_color_no_finger_outer_circle:
                    mNoFingerOuterCircleColor = typedArray.getColor(a, mNoFingerOuterCircleColor);
                    break;
                case R.styleable.GestureLockViewGroup_count:
                    mCount = typedArray.getInteger(a, count);
                    break;
                case R.styleable.GestureLockViewGroup_tryTimes:
                    mTryTimes = typedArray.getInteger(a, mTryTimes);
                    break;
            }

        }
        typedArray.recycle();
        //初始化畫筆

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPath = new Path();
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = MeasureSpec.getSize(widthMeasureSpec);
        mHeight = MeasureSpec.getSize(heightMeasureSpec);
        mHeight = mWidth = mWidth < mHeight ? mWidth : mHeight;
        //測量布局每個GestureLockView
        if (mGestureLockViews == null) {
            mGestureLockViews = new GestureLockView[mCount * mCount];
            // 這里鴻神說是根據(jù)屏幕寬度進行百分比的布局..計算方法沒看懂
            // 計算每個GestureLockView的寬度
            mGestureLockViewWidth = (int) (4 * mWidth * 1.0f / (5 * mCount + 1));
            //計算每個GestureLockView的間距
            mMarginBetweenLockView = (int) (mGestureLockViewWidth * 0.25);
            // 設(shè)置畫筆的寬度為GestureLockView的內(nèi)圓直徑稍微小點(不喜歡的話,隨便設(shè))
            mPaint.setStrokeWidth(mGestureLockViewWidth * 0.29f);
            for (int i = 0; i < mGestureLockViews.length; i++) {
                mGestureLockViews[i] = new GestureLockView(getContext(), mNoFingerInnerCircleColor, mNoFingerOuterCircleColor, mFingerOnColor, mFingerUpColor);
                mGestureLockViews[i].setId(i + 1);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(mGestureLockViewWidth, mGestureLockViewWidth);
                // 不是每行的第一個涉兽,則設(shè)置位置為前一個的右邊
                if (i % mCount != 0) {
                    params.addRule(RelativeLayout.RIGHT_OF, mGestureLockViews[i - 1].getId());
                }
                // 從第二行開始枷畏,設(shè)置為上一行同一位置View的下面
                if (i > mCount - 1) {
                    params.addRule(RelativeLayout.BELOW, mGestureLockViews[i - mCount].getId());
                }
                //設(shè)置右下左上的邊距
                int rightMargin = mMarginBetweenLockView;
                int bootomMargin = mMarginBetweenLockView;
                int leftMargin = 0;
                int topMargin = 0;
                //第一行有topMargin 第一列有l(wèi)eftMargin
                if (i >= 0 && i < mCount) {
                    topMargin = mMarginBetweenLockView;
                }

                if (i % mCount == 0) {
                    leftMargin = mMarginBetweenLockView;
                }
                params.setMargins(leftMargin, topMargin, rightMargin, bootomMargin);
                mGestureLockViews[i].setMode(GestureLockView.Mode.STATUS_NO_FINGER);
                addView(mGestureLockViews[i], params);
            }
        }
    }

    //這里就是處理手指滑動
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                    //手指按下的時候現(xiàn)把所有的重置
                reSet();
                break;
            case MotionEvent.ACTION_UP:
                //手指抬起的時候要進行剪頭角度的測量和繪制,以及判斷結(jié)果的正確與否
                mPaint.setColor(mFingerUpColor);
                mPaint.setAlpha(50);
                this.mTryTimes--;
                if (mOnGestureLockViewListener != null && mChoose.size() > 0) {
                    mOnGestureLockViewListener.onGestureEvent(checkAnswer());
                    if (mTryTimes <= 0) {
                        mOnGestureLockViewListener.onUnmatchedExceedBoundary();
                    }
                }
                //將終點設(shè)置為起點
                mTmpTarget.x = mLastPathX;
                mTmpTarget.y = mLastPathY;
                changeItemMode();
                for (int i = 0; i + 1 < mChoose.size(); i++) {
                    int startId = mChoose.get(i);
                    int nextId = mChoose.get(i + 1);
                    GestureLockView startView = (GestureLockView) findViewById(startId);
                    GestureLockView nextView = (GestureLockView) findViewById(nextId);
                    int dx = nextView.getLeft() - startView.getLeft();
                    int dy = nextView.getTop() - startView.getTop();
                    int degrees = (int) (Math.toDegrees(Math.atan2(dy, dx)) + 90);//角度的計算方法
                    startView.setmArrowDegree(degrees);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                mPaint.setColor(mFingerOnColor);
                mPaint.setAlpha(50);
                GestureLockView gestureLockView = getChildIdByPos(x, y);
                if (gestureLockView != null) {
                    int id = gestureLockView.getId();
                    if (!mChoose.contains(id)) {
                        mChoose.add(id);
                        gestureLockView.setMode(GestureLockView.Mode.STATUS_FINGER_ON);
                        if (mOnGestureLockViewListener != null) {
                            mOnGestureLockViewListener.onBlockSelected(id);
                        }
                        //設(shè)置劃線的起點
                        mLastPathX = gestureLockView.getLeft() / 2 + gestureLockView.getRight() / 2;
                        mLastPathY = gestureLockView.getTop() / 2 + gestureLockView.getBottom() / 2;
                        if (mChoose.size() == 1) {
                            mPath.moveTo(mLastPathX, mLastPathY);
                        } else {
                            mPath.lineTo(mLastPathX, mLastPathY);
                        }

                    }
                }
                mTmpTarget.x = x;
                mTmpTarget.y = y;
                break;
        }
        invalidate();
        return true;
    }

    /**
     * 恢復(fù)初始設(shè)置
     */
    private void reSet() {
        mChoose.clear();
        mPath.reset();
        for (GestureLockView gestureLockView : mGestureLockViews) {
            gestureLockView.setMode(GestureLockView.Mode.STATUS_NO_FINGER);
            gestureLockView.setmArrowDegree(-1);
        }
    }
    //檢測答案
    private boolean checkAnswer() {
        if (mAnswer.length != mChoose.size()) {
            Log.e(TAG,mAnswer.length+"length");
            return false;
        }
        for (int i = 0; i < mAnswer.length; i++) {
            Log.e(TAG,mChoose.get(i)+"point"+mAnswer[i]+"answer");
            if (mAnswer[i] != mChoose.get(i)) {
                return false;
            }
        }
        return true;
    }


    /**
     * 判斷當(dāng)前點是否在當(dāng)前view中
     *
     * @param gestureLockView
     * @param x
     * @param y
     * @return
     */
    private boolean checkPositionInChild(GestureLockView gestureLockView, int x, int y) {
        int padding = (int) (mGestureLockViewWidth * 0.15);
        if (x > gestureLockView.getLeft() + padding && x < gestureLockView.getRight() - padding &&
                y > gestureLockView.getTop() + padding && y < gestureLockView.getBottom() - padding
                ) {
            return true;
        }
        return false;
    }

    /**
     * 根據(jù)坐標(biāo)點獲取子view
     *
     * @param x
     * @param y
     * @return
     */
    private GestureLockView getChildIdByPos(int x, int y) {
        for (GestureLockView gestureLockView : mGestureLockViews) {
            if (checkPositionInChild(gestureLockView, x, y)) {
                return gestureLockView;
            }
        }
        return null;
    }

    private void changeItemMode() {
        for (GestureLockView gestureLockView : mGestureLockViews) {
            if (mChoose.contains(gestureLockView.getId())) {
                gestureLockView.setMode(GestureLockView.Mode.STATUS_FINGER_UP);
            }
        }
    }


    public void setListener(OnGestureLockViewListener listener) {
        this.mOnGestureLockViewListener = listener;
    }

    public void setAnswer(int[] answer) {
        this.mAnswer = answer;
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if (mPath != null) {
            canvas.drawPath(mPath, mPaint);
        }
        if (mChoose.size() > 0) {
            if (mLastPathX != 0 && mLastPathY != 0) {
                canvas.drawLine(mLastPathX, mLastPathY, mTmpTarget.x, mTmpTarget.y, mPaint);
            }
        }
    }

    public interface OnGestureLockViewListener {
        /**
         * 單獨選中元素的Id
         *
         * @param cId
         */
        public void onBlockSelected(int cId);

        /**
         * 是否匹配
         *
         * @param matched
         */
        public void onGestureEvent(boolean matched);

        /**
         * 超過嘗試次數(shù)
         */
        public void onUnmatchedExceedBoundary();
    }
}

自定義的屬性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="color_no_finger_inner_circle" format="color"/>
    <attr name="color_no_finger_outer_circle" format="color"/>
    <attr name="color_finger_on" format="color"/>
    <attr name="color_finger_up" format="color"/>
    <attr name="count" format="integer"/>
    <attr name="tryTimes" format="integer"/>
    <declare-styleable name="GestureLockViewGroup">
        <attr name="color_no_finger_inner_circle"/>
        <attr name="color_no_finger_outer_circle" />
        <attr name="color_finger_on" />
        <attr name="color_finger_up" />
        <attr name="count" />
        <attr name="tryTimes" />
    </declare-styleable>
    
</resources>

布局調(diào)用,自定義的顏色沒有加

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:attar="http://schemas.android.com/apk/armglobe.gesture"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="armglobe.gesture.MainActivity">

    <armglobe.gesture.GestureLockViewGroup
        android:id="@+id/getsturegroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#F2F2F7"
        android:gravity="center_vertical"
        attar:count="4"
        attar:tryTimes="5" />

</RelativeLayout>

Activity代碼

public class MainActivity extends AppCompatActivity {
    GestureLockViewGroup gestureLockViewGroup;
    GestureLockViewGroup.OnGestureLockViewListener lockViewListener = new GestureLockViewGroup.OnGestureLockViewListener() {
        @Override
        public void onBlockSelected(int cId) {

        }

        @Override
        public void onGestureEvent(boolean matched) {
            if(matched){
                Toast.makeText(MainActivity.this,"正確",Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(MainActivity.this,"錯誤",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onUnmatchedExceedBoundary() {
            Toast.makeText(MainActivity.this,"已經(jīng)超出最大重試次數(shù)",Toast.LENGTH_SHORT).show();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gestureLockViewGroup = (GestureLockViewGroup) findViewById(R.id.getsturegroup);
        gestureLockViewGroup.setListener(lockViewListener);
    }
}

好了手勢解鎖的代碼就這些,下面可以開始看realm數(shù)據(jù)庫的使用了,之前項目都是用的sql語句,反正寫的要吐血,這次看看專門為移動的數(shù)據(jù)庫會怎么樣


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末触趴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袋倔,更是在濱河造成了極大的恐慌雕蔽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宾娜,死亡現(xiàn)場離奇詭異批狐,居然都是意外死亡前塔,警方通過查閱死者的電腦和手機嚣艇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來华弓,“玉大人食零,你說我怎么就攤上這事〖牌粒” “怎么了贰谣?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迁霎。 經(jīng)常有香客問我吱抚,道長,這世上最難降的妖魔是什么考廉? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任秘豹,我火速辦了婚禮,結(jié)果婚禮上昌粤,老公的妹妹穿的比我還像新娘既绕。我一直安慰自己,他們只是感情好涮坐,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布凄贩。 她就那樣靜靜地躺著,像睡著了一般膊升。 火紅的嫁衣襯著肌膚如雪怎炊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天廓译,我揣著相機與錄音评肆,去河邊找鬼。 笑死非区,一個胖子當(dāng)著我的面吹牛瓜挽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播征绸,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼久橙,長吁一口氣:“原來是場噩夢啊……” “哼俄占!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆衷,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缸榄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祝拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甚带,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年佳头,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹰贵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡康嘉,死狀恐怖碉输,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亭珍,我是刑警寧澤敷钾,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站肄梨,受9級特大地震影響闰非,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峭范,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘪贱。 院中可真熱鬧纱控,春花似錦、人聲如沸菜秦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球昨。三九已至尔店,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間主慰,已是汗流浹背嚣州。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留共螺,地道東北人该肴。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像藐不,于是被迫代替她去往敵國和親匀哄。 傳聞我的和親對象是個殘疾皇子秦效,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件涎嚼、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,102評論 4 62
  • 親愛的朱: 今年的最后一天多了一秒阱州,又可以多想你一秒。這一秒你說我在想什么呢法梯?想你的容顏苔货?想你的笑?想牽手的傻...
    彎路處的老橡樹閱讀 1,949評論 0 0
  • 2016年10月14日鹊汛。被安排到 你不懂得安排時間 你不懂得利用時間 但請你珍惜我的時間 我很忙的 忙著睡覺 ...
    冰島金鳴閱讀 157評論 0 0