自定義控件:旋轉(zhuǎn)菜單

效果圖

自定義控件

項目概述

首先供常,我們學習如何自定義一個組合控件悼凑,其中偿枕,優(yōu)酷菜單是一個典型的自定義組合控件捐迫,它的效果圖如圖1-1 所示:

圖中由中間往外,分別是一級菜單断国、二級菜單源祈、三級菜單。其基本用法是:點擊一級菜單后加載二級菜單墓塌,再點擊二級菜單加載三級菜單瘟忱,如圖1-2(c)—(d)—(e)—(f),再點擊一級菜單分別隱藏三級苫幢、二級菜單
1-2(a)—(b)访诱。并且點擊手機菜單鍵,讓菜單根據(jù)狀態(tài)來顯示和隱藏韩肝,演示效果圖如圖1-2 所示触菜。

優(yōu)酷菜單UI

優(yōu)酷菜單的整體布局采用RelativeLayout,每一級菜單都是一個RelativeLayout哀峻。優(yōu)酷菜單的布局文件activity_main.xml涡相,具體的代碼如文件【1-1】所示:
【文件1-1】activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <!--三級菜單-->
    <RelativeLayout
        android:id="@+id/rl_level3"
        android:layout_width="280dp"
        android:layout_height="140dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level3">

        <ImageView
            android:id="@+id/iv_channel1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="10dp"
            android:src="@drawable/channel1"/>

        <ImageView
            android:id="@+id/iv_channel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel1"
            android:layout_alignLeft="@id/iv_channel1"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="25dp"
            android:src="@drawable/channel2"/>

        <ImageView
            android:id="@+id/iv_channel3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel2"
            android:layout_alignLeft="@id/iv_channel2"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="35dp"
            android:src="@drawable/channel3"/>

        <ImageView
            android:id="@+id/iv_channel4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:src="@drawable/channel4"/>

        <ImageView
            android:id="@+id/iv_channel7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_margin="10dp"
            android:src="@drawable/channel7"/>

        <ImageView
            android:id="@+id/iv_channel6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel7"
            android:layout_alignRight="@id/iv_channel7"
            android:layout_marginBottom="5dp"
            android:layout_marginRight="25dp"
            android:src="@drawable/channel6"/>

        <ImageView
            android:id="@+id/iv_channel5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel6"
            android:layout_alignRight="@id/iv_channel6"
            android:layout_marginBottom="5dp"
            android:layout_marginRight="35dp"
            android:src="@drawable/channel5"/>
    </RelativeLayout>

    <!--二級菜單-->
    <RelativeLayout
        android:id="@+id/rl_level2"
        android:layout_width="180dp"
        android:layout_height="90dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level2">

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="10dp"
            android:src="@drawable/icon_search"/>

        <ImageView
            android:id="@+id/iv_menu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:src="@drawable/icon_menu"/>

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_margin="10dp"
            android:src="@drawable/icon_myyouku"/>
    </RelativeLayout>

    <!--二級菜單-->
    <RelativeLayout
        android:id="@+id/rl_level1"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level1">

        <ImageView
            android:id="@+id/iv_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/icon_home"/>
    </RelativeLayout>
</RelativeLayout>

運行程序,效果圖如圖1-3 所示

這里寫圖片描述

優(yōu)酷菜單業(yè)務邏輯實現(xiàn)

布局UI 實現(xiàn)之后剩蟀,我們需要實現(xiàn)優(yōu)酷菜單的業(yè)務邏輯代碼催蝗,具體代碼如文件【1-2】所示:【文件1-2】com.itheima.youku.MainActivity

package com.github.rotatemenu;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

/**
 * ============================================================
 * Copyright:${TODO}有限公司版權(quán)所有 (c) 2017
 * Author:   AllenIverson
 * Email:    815712739@qq.com
 * GitHub:   https://github.com/JackChen1999
 * 博客:     http://blog.csdn.net/axi295309066
 * 微博:     AndroidDeveloper
 * <p>
 * Project_Name:RotateMenu
 * Package_Name:com.github.rotatemenu
 * Version:1.0
 * time:2016/2/28 21:47
 * des :三級旋轉(zhuǎn)菜單
 * gitVersion:$Rev$
 * updateAuthor:$Author$
 * updateDate:$Date$
 * updateDes:${TODO}
 * ============================================================
 */
public class MainActivity extends Activity implements View.OnClickListener {
    private RelativeLayout rlLevel1, rlLevel2, rlLevel3;
    private boolean isLevel1Show = true;
    private boolean isLevel2Show = true;
    private boolean isLevel3Show = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView ivHome = (ImageView) findViewById(R.id.iv_home);
        ImageView ivMenu = (ImageView) findViewById(R.id.iv_menu);
        rlLevel1 = (RelativeLayout) findViewById(R.id.rl_level1);
        rlLevel2 = (RelativeLayout) findViewById(R.id.rl_level2);
        rlLevel3 = (RelativeLayout) findViewById(R.id.rl_level3);
        ivHome.setOnClickListener(this);
        ivMenu.setOnClickListener(this);
        // 為了避免第三層布局將一二層事件攔截掉, 需要在布局文件中最先注冊第三層, 最后注冊第一層
        rlLevel3.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_home:
                System.out.println("home clicked!");
                if (Tools.mAnimtionNum != 0) {
                    break;
                }

                if (isLevel2Show) {
                    Tools.hideView(rlLevel2);// 隱藏第二層布局
                    isLevel2Show = false;
                    if (isLevel3Show) {// 如果發(fā)現(xiàn)第三次也展現(xiàn), 也需要隱藏
                        Tools.hideView(rlLevel3, 200);// 動畫延時200 毫秒再運行
                        isLevel3Show = false;
                    }
                } else {
                    Tools.showView(rlLevel2);
                    isLevel2Show = true;
                }
                break;
            case R.id.iv_menu:
                if (Tools.mAnimtionNum != 0) {
                    break;
                }
                System.out.println("menu clicked!");
                if (isLevel3Show) {
                    Tools.hideView(rlLevel3);
                    isLevel3Show = false;
                } else {
                    Tools.showView(rlLevel3);
                    isLevel3Show = true;
                }
                break;
            default:
                break;
        }
    }
    //監(jiān)聽用戶的物理按鍵
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            if (Tools.mAnimtionNum != 0) {
                return true;
            }
            if (isLevel1Show) {
                Tools.hideView(rlLevel1);
                isLevel1Show = false;
                if (isLevel2Show) {
                    Tools.hideView(rlLevel2, 200);
                    isLevel2Show = false;
                }
                if (isLevel3Show) {
                    Tools.hideView(rlLevel3, 300);

                    isLevel3Show = false;
                }
            } else {
                Tools.showView(rlLevel1);
                isLevel1Show = true;
                Tools.showView(rlLevel2, 200);
                isLevel2Show = true;
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Tools 工具類的邏輯實現(xiàn)

為了隱藏View 和顯示View,在工具類Tools.java 中定義了兩個方法育特,具體代碼如文件【】所示:【文件1-3】com.itheima.youku.Tools

package com.github.rotatemenu;

import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;

/**
 * ============================================================
 * Copyright:${TODO}有限公司版權(quán)所有 (c) 2017
 * Author:   AllenIverson
 * Email:    815712739@qq.com
 * GitHub:   https://github.com/JackChen1999
 * 博客:     http://blog.csdn.net/axi295309066
 * 微博:     AndroidDeveloper
 * <p>
 * Project_Name:RotateMenu
 * Package_Name:com.github.rotatemenu
 * Version:1.0
 * time:2016/2/28 21:47
 * des :三級旋轉(zhuǎn)菜單
 * gitVersion:$Rev$
 * updateAuthor:$Author$
 * updateDate:$Date$
 * updateDes:${TODO}
 * ============================================================
 */

public class Tools {
    public static void hideView(ViewGroup view) {
        hideView(view, 0);
    }

    public static void showView(ViewGroup view) {
        showView(view, 0);
    }

    public static int mAnimtionNum = 0; //用于記錄當前正在執(zhí)行的動畫個數(shù)

    /**
     * 隱藏動畫
     *
     * @param view  將要執(zhí)行動畫的視圖
     * @param delay 動畫要延遲執(zhí)行的時間
     */
    public static void hideView(ViewGroup view, long delay) {
        /**
         * 第一個參數(shù): fromDegrees 起始角度丙号,這里我們設置為0
         * 第二個參數(shù): toDegrees 目標角度,這里設置為180 度
         * 第三個參數(shù): pivotXType 相對于X 坐標類型缰冤,這里是相對于自己
         * 第四個參數(shù): pivotXValue 相對于X 坐標類型的值槽袄,這里是0.5f,也就是X 軸的一半
         * 第五個參數(shù): pivotYType 相對于Y 坐標類型,這里是相對于自己
         * 第六個參數(shù): pivotYValue 相對于Y 坐標類型的值锋谐,這里是1.f,也就是Y 坐標最大處
         * RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType,
         pivotYValue)
         */
        RotateAnimation anim = new RotateAnimation(0, 180,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 1f);
        anim.setDuration(500); //動畫執(zhí)行時間
        anim.setFillAfter(true); // 保持動畫后的狀態(tài)
        anim.setStartOffset(delay); // 延遲多長時間后才運行動畫
        anim.setAnimationListener(new MyAnimationListener());
        view.startAnimation(anim);
        // 禁用所有孩子的點擊事件
        int childCount = view.getChildCount();
        for (int i = 0; i < childCount; i++) {
            view.getChildAt(i).setEnabled(false); // 禁用點擊事件
        }
    }

    /**
     * 顯示動畫
     *
     * @param view  將要執(zhí)行動畫的視圖
     * @param delay 動畫要延遲執(zhí)行的時間
     */
    public static void showView(ViewGroup view, long delay) {
        RotateAnimation anim = new RotateAnimation(180, 360,
                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1f);
        anim.setDuration(500);
        anim.setFillAfter(true); // 保持動畫后的狀態(tài)
        anim.setStartOffset(delay); // 延遲多長時間后才運行動畫
        anim.setAnimationListener(new MyAnimationListener());
        view.startAnimation(anim);
        // 開啟所有孩子的點擊事件
        int childCount = view.getChildCount();
        for (int i = 0; i < childCount; i++) {
            view.getChildAt(i).setEnabled(true);// 開啟點擊事件
        }
    }

    public static class MyAnimationListener implements Animation.AnimationListener {
        @Override
        public void onAnimationStart(Animation animation) {
            mAnimtionNum++;
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            mAnimtionNum--;
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    }
}

知識點總結(jié)

1.補間動畫不能改變控件的實際位置遍尺,控件還是能夠響應原先的事件。在菜單隱藏后還會響應點擊事件涮拗,因此在Tools.java 的第32 到36 行在隱藏菜單時乾戏,通過遍歷相對布局的子控件,設置其為不可用來解決此bug三热,
在顯示菜單時鼓择,第51 到55 行通過遍歷相對布局的子控件,設置為可用就漾。

2.連續(xù)點擊菜單時呐能,優(yōu)酷菜單動畫會直接執(zhí)行,產(chǎn)生一個隱藏動畫還沒執(zhí)行完,就執(zhí)行顯示動畫的bug摆出,因此在Tools.java 的隱藏和顯示動畫中都設置了動畫監(jiān)聽MyAnimationListener朗徊,在點擊菜單時,先判斷Tools
的動畫數(shù)量mAnimtionNum(Tools.java 第8 行)是否為0偎漫,再執(zhí)行下一個動畫爷恳,來解決bug。

布局文件

<?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">

    <Button
        android:id="@id/btn_menu"
        android:layout_width="280dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:text="Menu鍵"
        android:textColor="#fff"
        android:background="@drawable/progress_normal"
        android:textAllCaps="false"/>

    <!--一級菜單-->
    <RelativeLayout
        android:id="@+id/rl_level1"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@mipmap/level1">

        <ImageView
            android:id="@+id/iv_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@mipmap/icon_home"/>
    </RelativeLayout>
    <!--二級菜單-->
    <RelativeLayout
        android:id="@+id/rl_level2"
        android:layout_width="180dp"
        android:layout_height="90dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@mipmap/level2">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="10dp"
            android:src="@mipmap/icon_search"/>

        <ImageView
            android:id="@+id/iv_menu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:src="@mipmap/icon_menu"/>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_margin="10dp"
            android:src="@mipmap/icon_myyouku"/>

    </RelativeLayout>

    <!--三級菜單-->
    <include
        layout="@layout/menu_level3"
        />

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_level3"
    android:layout_width="280dp"
    android:layout_height="140dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="@mipmap/level3">

    <ImageView
        android:id="@+id/channel1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_margin="10dp"
        android:src="@mipmap/channel1"/>
    <ImageView
        android:id="@+id/channel2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/channel1"
        android:layout_alignLeft="@+id/channel1"
        android:layout_marginLeft="25dp"
        android:layout_marginBottom="5dp"
        android:src="@mipmap/channel2"/>
    <ImageView
        android:id="@+id/channel3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/channel2"
        android:layout_alignLeft="@+id/channel2"
        android:layout_marginLeft="35dp"
        android:layout_marginBottom="5dp"
        android:src="@mipmap/channel3"/>
    <ImageView
        android:id="@+id/channel4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5dp"
        android:src="@mipmap/channel4"/>
    <ImageView
        android:id="@+id/channel5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/channel6"
        android:layout_alignRight="@+id/channel6"
        android:layout_marginBottom="5dp"
        android:layout_marginRight="35dp"
        android:src="@mipmap/channel5"/>
    <ImageView
        android:id="@+id/channel6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/channel7"
        android:layout_alignRight="@+id/channel7"
        android:layout_marginBottom="5dp"
        android:layout_marginRight="25dp"
        android:src="@mipmap/channel6"/>
    <ImageView
        android:id="@+id/channel7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="10dp"
        android:src="@mipmap/channel7"/>

</RelativeLayout>

實現(xiàn)代碼

RotateMenuActivity.java

public class RotateMenuActivity extends AppCompatActivity implements View.OnClickListener{

    @Bind(R.id.iv_home)
    public ImageView mIv_home;
    @Bind(R.id.iv_menu)
    public ImageView mIv_menu;
    @Bind(R.id.rl_level1)
    public RelativeLayout mLevel1;
    @Bind(R.id.rl_level2)
    public RelativeLayout mLevel2;
    @Bind(R.id.rl_level3)
    public RelativeLayout mLevel3;
    @Bind(R.id.btn_menu)
    public Button btn_menu;

    private boolean isShowlevel2 = true;
    private boolean isShowlevel3 = true;
    private boolean isShowmenu = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initListener();
    }

    private void initView() {
        setContentView(R.layout.activity_rotate_menu);
        ButterKnife.bind(this);

        SpannableString title = new SpannableString("三級旋轉(zhuǎn)菜單");
        title.setSpan(new ForegroundColorSpan(Color.WHITE),0,title.length(),
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(title);
    }

    private void initListener() {
        mIv_home.setOnClickListener(this);
        mIv_menu.setOnClickListener(this);
        btn_menu.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.iv_home:
                if (AnimUtil.animCount != 0){
                    return;
                }
                if (isShowlevel2){
                    int startOffset = 0;
                    if (isShowlevel3){
                        AnimUtil.closeMenu(mLevel3,startOffset);
                        startOffset += 200;
                        isShowlevel3 = false;
                    }
                    AnimUtil.closeMenu(mLevel2,startOffset);
                }else {
                    AnimUtil.openMenu(mLevel2,0);
                }
                isShowlevel2 = !isShowlevel2;
                break;
            case R.id.iv_menu:
                if (AnimUtil.animCount != 0){
                    return;
                }
                if (isShowlevel3){
                    AnimUtil.closeMenu(mLevel3,0);
                }else {
                    AnimUtil.openMenu(mLevel3,0);
                }
                isShowlevel3 = !isShowlevel3;
                break;
            case R.id.btn_menu:
                showMenu();
                break;
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU){
            showMenu();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void showMenu(){
        if (isShowmenu){
            int startOffset = 0;
            if (isShowlevel3){
                AnimUtil.closeMenu(mLevel3,startOffset);
                isShowlevel3 = false;
                startOffset += 200;
            }
            if (isShowlevel2){
                AnimUtil.closeMenu(mLevel2,startOffset);
                isShowlevel2 = false;
                startOffset += 200;
            }
            AnimUtil.closeMenu(mLevel1,startOffset);
        }else {
            AnimUtil.openMenu(mLevel1,0);
            AnimUtil.openMenu(mLevel2,200);
            isShowlevel2 = true;
            AnimUtil.openMenu(mLevel3,400);
            isShowlevel3 = true;
        }
        isShowmenu = !isShowmenu;
    }
}

AnimUtil.java

public class AnimUtil {

    public static int animCount = 0;//記錄當前執(zhí)行的動畫數(shù)量

    public static void closeMenu(View view, int startOffset) {
        view.setPivotX(view.getWidth()/2);
        view.setPivotY(view.getHeight());
        //view.invalidate();
        view.animate().rotation(-180).setDuration(500).setListener(mListener).setStartDelay
                (startOffset).start();
    }

    public static void openMenu(View view, int startOffset) {
        view.setPivotX(view.getWidth()/2);
        view.setPivotY(view.getHeight());
        //view.invalidate();
        view.animate().rotation(0).setDuration(500).setListener(mListener).setStartDelay
                (startOffset).start();
    }

    static AnimatorListener mListener = new AnimatorListenerAdapter() {

        @Override
        public void onAnimationStart(Animator animation) {
            animCount++;
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            animCount--;
        }
    };
}

代碼:https://github.com/JackChen1999/RotateMenu

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末象踊,一起剝皮案震驚了整個濱河市温亲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杯矩,老刑警劉巖栈虚,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異史隆,居然都是意外死亡节芥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門逆害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚣驼,你說我怎么就攤上這事魄幕。” “怎么了颖杏?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵纯陨,是天一觀的道長。 經(jīng)常有香客問我留储,道長翼抠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任获讳,我火速辦了婚禮阴颖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丐膝。我一直安慰自己量愧,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布帅矗。 她就那樣靜靜地躺著偎肃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浑此。 梳的紋絲不亂的頭發(fā)上累颂,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音凛俱,去河邊找鬼紊馏。 笑死料饥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瘦棋。 我是一名探鬼主播稀火,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赌朋!你這毒婦竟也來了凰狞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沛慢,失蹤者是張志新(化名)和其女友劉穎赡若,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體团甲,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡逾冬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躺苦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片身腻。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匹厘,靈堂內(nèi)的尸體忽然破棺而出嘀趟,到底是詐尸還是另有隱情,我是刑警寧澤愈诚,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布她按,位于F島的核電站,受9級特大地震影響炕柔,放射性物質(zhì)發(fā)生泄漏酌泰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一匕累、第九天 我趴在偏房一處隱蔽的房頂上張望陵刹。 院中可真熱鬧,春花似錦欢嘿、人聲如沸授霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘耳。三九已至,卻和暖如春框弛,著一層夾襖步出監(jiān)牢的瞬間辛辨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斗搞,地道東北人指攒。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像僻焚,于是被迫代替她去往敵國和親允悦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫虑啤、插件隙弛、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,096評論 4 62
  • (一) 中午時分,在朋友的小店閑坐勘纯,正喝著茶聊著天局服,從門口進來了一位中年男子。 只見他徑直走進店內(nèi)驳遵,朋友以為他是來...
    落雪非花閱讀 397評論 6 11
  • ta是你生命中的過客 卻是住在你心里的骋迹客 客終究留不住 ta只會成為過往 苦了自己又哭了別人 握不住的沙 松開也...
    沫里閱讀 245評論 0 1
  • 2017年11月9日,今天是星期四超埋,早晨起床,楊峰瑞同學一系列的洗臉刷牙吃早飯佳鳖,在上學的路上我問他考試怎么...
    航航2閱讀 116評論 0 0