Android列表三级滑动实现

先上图

三级滑动.gif

上代码

package com.example.jzg.mvpdemo.view;


import android.content.Context;
import android.content.res.Resources;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.example.jzg.mvpdemo.Utils.DensityUtil;

/**
 * author: guochen
 * date: 2017/11/11 17:57
 * email:
 */
public class SeekProductMenu extends ViewGroup {
    private static final String TAG = "SeekProductMenu";
    private ViewDragHelper viewDragHelper;
    private FrameLayout twoMenuView;
    private FrameLayout threeMenuView;
    private int creenWidth;
    private int creenHeight;
    private FrameLayout oneMenuView;
    private RecyclerView oneMenuList;
    private RecyclerView twoMenuList;
    private int twoMenuViewWidth;
    private boolean twoMenuIsOpen = false;//给二级菜单的开关标志
    private boolean threeMenuIsOpen = false;//给二级菜单的开关标志
    private int threeMenuViewWidth;
    private RecyclerView threeMenuList;
    private int twoMenuViewLeft;//二级菜单距离屏幕左边的距离
    private int threeMenuViewLeft;//三级菜单距离屏幕左边的距离
    private int dx;//down事件时的坐标
    //二级和三级菜单的开关状态
    private static final int ALL_CLOSE = 0;//二级菜单和三级菜单都处于关闭状态
    private static final int TWO_OPEN = 1;//只有二级菜单打开
    private static final int TWO_THREE_OPEN = 2;//二级菜单和三级菜单都打开是的状态
    private int nowState = ALL_CLOSE;//当前处于的状态 //3
    private int threeMenuLeftAxis;
    private int twoMenuLeftAxis;
    private Context context;

    private ViewDragHelper viewDragHelper2;
    private int downY;

    public SeekProductMenu(Context context) {
        this(context, null);
    }

    public SeekProductMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        // 获取 viewDragHelper实例
        viewDragHelper = ViewDragHelper.create(this, new MyCallBack());
        viewDragHelper2 = ViewDragHelper.create(this, new MyCallBack());
        //获取屏幕宽高
        int[] creenSize = getScreenSize();
        //宽
        creenWidth = creenSize[0];
        //高
        creenHeight = creenSize[1];


    }

    /**
     * 该方法在布局文件加载完毕后被回调
     */
    @Override
    protected void onFinishInflate() {
        //获取一级菜单实例
        oneMenuView = (FrameLayout) getChildAt(0);
        oneMenuList = (RecyclerView) oneMenuView.getChildAt(0);
        //获取二级菜单实例
        twoMenuView = (FrameLayout) getChildAt(1);
        twoMenuList = (RecyclerView) twoMenuView.getChildAt(0);
        //获取三级菜单实例
        threeMenuView = (FrameLayout) getChildAt(2);
        threeMenuList = (RecyclerView) threeMenuView.getChildAt(0);


    }

    /**
     * 测量子视图
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //测量一级菜单
        oneMenuView.measure(widthMeasureSpec, heightMeasureSpec);

        //测量二级菜单
        //设置二级菜单为屏幕的4/5宽
        twoMenuViewWidth = (int) (creenWidth * 0.8 + 0.5) + 20;
        int twoMenuViewWidthSpec = MeasureSpec.makeMeasureSpec(twoMenuViewWidth, MeasureSpec.EXACTLY);
        twoMenuView.measure(twoMenuViewWidthSpec, heightMeasureSpec);

        //测量三级菜单
        //设置三级菜单为屏幕的3/5
        threeMenuViewWidth = (int) (creenWidth * 0.55 + 0.5) + 30;
        int threeMenuViewWidthSpec = MeasureSpec.makeMeasureSpec(threeMenuViewWidth, MeasureSpec.EXACTLY);
        threeMenuView.measure(threeMenuViewWidthSpec, heightMeasureSpec);

        //设置视图本身
        setMeasuredDimension(creenWidth, creenHeight);
    }

    /**
     * 给子视图布局
     *
     * @param b
     * @param i
     * @param i1
     * @param i2
     * @param i3
     */
    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {
        //给一级菜单布局
        oneMenuView.layout(0, 0, creenWidth, creenHeight);

        //给二级菜单布局
        if (nowState != TWO_OPEN && nowState != TWO_THREE_OPEN) {
            twoMenuView.layout(creenWidth, 0, creenWidth + twoMenuViewWidth, creenHeight);
        } else {
            twoMenuView.layout((int) (creenWidth * 0.2 + 0.5) - 20, 0, creenWidth, creenHeight);
        }

        if (nowState != TWO_THREE_OPEN) {
            //给三级菜单布局
            threeMenuView.layout(creenWidth, 0, creenWidth + threeMenuViewWidth, creenHeight);
        } else {
            threeMenuView.layout((int) (creenWidth * 0.45 + 0.5), 0, creenWidth, creenHeight);
        }

    }

    /**
     * 重写onInterceptTouchEvent自定义事件拦截规则
     *
     * @param ev
     * @return
     */
    int downX = 0;

    /**
     * 自定义事件分发
     *
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = dx = (int) (ev.getX() + 0.5f);
                downY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:

                //判断当用户左右滑动的时候拦截子视图事件(也就是当用户左右滑动的时候拦截ListView的事件走自己的事件)
                //上下滑动或者点击的时候走ListView的事件
                int moveY = (int) ev.getY();
                int moveX = (int) (ev.getX() + 0.5f);
                int moveDistanceX = (downX - moveX) > 0 ? (downX - moveX) : (moveX - downX);
                int moveDistanceY = (downY - moveY) > 0 ? (downY - moveY) : (moveY - downY);

                //当上下滑动时,不拦截事件,走ListView的事件
                if (moveDistanceY > 20) {
                    return false;
                }
//当左右滑动的时候,拦截子控件事件,也就是拦截ListView的事件,走自己的左右滑动事件
                if (moveDistanceX > 10 && moveDistanceY < 20) {
                    downX = (int) (ev.getX() + 0.5f);
                    return true;
                }
                break;
        }
        return false;
    }

    /**
     * 重写onTouchEvent自定义滑动事件
     *
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                View view = getTouchView(event, downX); //获取被触摸到的View
                slideEvent(event, view); //处理被触摸到的View的滑动事件
                break;
            case MotionEvent.ACTION_UP:

                switch (nowState) {
                    case TWO_THREE_OPEN:
                        /**
                         * 当二级菜单和三级菜单都处于打开状态时的事件处理
                         */
                        if (getTouchView(event, downX) == threeMenuView) {//当二级菜单和三级菜单都处于打开状态,并且手指触摸到的是三级菜单时的事件处理
                            if (threeMenuViewLeft < creenWidth / 2 + DensityUtil.px2dip(context, 50)) {
                                viewDragHelper.smoothSlideViewTo(threeMenuView, (int) (creenWidth * 0.45 + 0.5), 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                threeMenuViewLeft = (int) (creenWidth * 0.45 + 0.5);
                                threeMenuIsOpen = true;
                                nowState = TWO_THREE_OPEN;
                            } else {
                                viewDragHelper.smoothSlideViewTo(threeMenuView, creenWidth, 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                threeMenuIsOpen = false;
                                nowState = TWO_OPEN;
                                threeMenuViewLeft = creenWidth;

                                //接口回调,监听菜单被关闭时,恢复菜单item默认背景颜色
                                //  //恢复二级菜单item默认背景颜色
                                if (recoverListViewItemBackground != null) {
                                    recoverListViewItemBackground.onRecoverTwoListViewItemBackgroundListener();
                                }

                            }
                        } else if (getTouchView(event, downX) == twoMenuView) {

                            //当二级菜单和三级菜单都处于打开状态,并且手指触摸到的是二级菜单时的事件处理

                            if (twoMenuViewLeft < creenWidth / 2) {
                                viewDragHelper.smoothSlideViewTo(twoMenuView, (int) (creenWidth * 0.2 + 0.5) - 20, 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                viewDragHelper2.smoothSlideViewTo(threeMenuView, (int) (creenWidth * 0.45 + 0.5), 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                twoMenuViewLeft = (int) (creenWidth * 0.2 + 0.5);
                                threeMenuViewLeft = (int) (creenWidth * 0.45 + 0.5);
                                threeMenuIsOpen = true;
                                twoMenuIsOpen = true;
                                nowState = TWO_THREE_OPEN;
                            } else {
                                viewDragHelper.smoothSlideViewTo(twoMenuView, creenWidth, 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                viewDragHelper2.smoothSlideViewTo(threeMenuView, creenWidth + DensityUtil.px2dip(context, 300), 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                twoMenuViewLeft = creenWidth;
                                threeMenuViewLeft = creenWidth;
                                threeMenuIsOpen = false;
                                twoMenuIsOpen = false;
                                nowState = ALL_CLOSE;
                                //接口回调,监听菜单被关闭时,恢复菜单item默认背景颜色
                                //恢复一级菜单item默认背景颜色
                                if (recoverListViewItemBackground != null) {
                                    recoverListViewItemBackground.onRecoverOneListViewItemBackgroundListener();
                                }
                            }
                        }
                        break;
                    case TWO_OPEN:
                        /**
                         * 当只有二级菜单处于打开状态并且三级菜单处于关闭状态时的事件处理
                         */
                        if (getTouchView(event, downX) == twoMenuView) { //当手指触摸到的是二级菜单时的事件处理
                            if (twoMenuViewLeft < creenWidth / 2) {
                                viewDragHelper.smoothSlideViewTo(twoMenuView, (int) (creenWidth * 0.2 + 0.5) - 20, 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                twoMenuViewLeft = (int) (creenWidth * 0.2 + 0.5);
                                twoMenuIsOpen = true;
                                nowState = TWO_OPEN;
                            } else {
                                viewDragHelper.smoothSlideViewTo(twoMenuView, (int) creenWidth, 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                viewDragHelper2.smoothSlideViewTo(threeMenuView, (int) creenWidth + DensityUtil.dip2px(context, 300), 0);
                                ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
                                twoMenuViewLeft = creenWidth;
                                twoMenuIsOpen = false;
                                nowState = ALL_CLOSE;
                                //接口回调,监听菜单被关闭时,恢复菜单item默认背景颜色
                                //恢复一级菜单item默认背景颜色

                                if (recoverListViewItemBackground != null) {
                                    recoverListViewItemBackground.onRecoverOneListViewItemBackgroundListener();
                                }
                            }
                        }
                }
        }
        return super.onTouchEvent(event);
    }


    /**
     * 滑动事件处理
     *
     * @param ev    MotionEvent
     * @param child 被触摸到的View
     * @return 返回被触摸到的View距离屏幕左边的距离
     */
    public int slideEvent(MotionEvent ev, View child) {

        int moveX = (int) (ev.getX() + 0.5);//滑动后的X坐标
        int slideDistance = downX - moveX;//滑动的距离
        //如果被触摸到的View是二级菜单并且只有二级菜单处于打开状态时
        if (child == twoMenuView && nowState == TWO_OPEN) {

            //计算二级菜单移动的位置
            twoMenuLeftAxis = twoMenuViewLeft - slideDistance;
            //边界限定
            twoMenuLeftAxis = Math.max((int) (creenWidth * 0.2 + 0.5) - 20, twoMenuLeftAxis);

            //重新布局
            twoMenuView.layout(twoMenuLeftAxis, 0, creenWidth + twoMenuLeftAxis, creenHeight);
            downX = (int) (ev.getX() + 0.5f);
            twoMenuViewLeft = twoMenuLeftAxis;
            ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
            return twoMenuViewLeft;
        } else if (child == twoMenuView && nowState == TWO_THREE_OPEN) {
            /**
             * 这种情况是当手指触摸到二级菜单并且三级菜单也是打开状态时
             */
            //计算二级菜单移动的位置
            int twoMenuLeftAxis = twoMenuViewLeft - slideDistance;
            //计算三级菜单到屏幕左边的距离
            threeMenuLeftAxis = threeMenuViewLeft - slideDistance;
            //二级菜单边界限定
            twoMenuLeftAxis = Math.max((int) (creenWidth * 0.2 + 0.5) - 20, twoMenuLeftAxis);
            //三级菜单边界限定
            threeMenuLeftAxis = Math.max((int) (creenWidth * 0.45 + 0.5), threeMenuLeftAxis);
            //重新布局
            twoMenuView.layout(twoMenuLeftAxis, 0, creenWidth + twoMenuLeftAxis, creenHeight);
            threeMenuView.layout(threeMenuLeftAxis, 0, creenWidth + threeMenuLeftAxis, creenHeight);
            downX = (int) (ev.getX() + 0.5f);
            twoMenuViewLeft = twoMenuLeftAxis;
            threeMenuViewLeft = threeMenuLeftAxis;

        } else if (child == threeMenuView) {
            threeMenuLeftAxis = threeMenuViewLeft - slideDistance;
            //三级菜单边界限定
            threeMenuLeftAxis = Math.max((int) (creenWidth * 0.45 + 0.5), threeMenuLeftAxis);
            threeMenuView.layout(threeMenuViewLeft - slideDistance, 0, creenWidth + threeMenuLeftAxis, creenHeight);
            downX = (int) (ev.getX() + 0.5f);
            threeMenuViewLeft = threeMenuLeftAxis;
        }
        return 0;
    }


    /**
     * 获取当手指按下时触摸到的子视图,用于用户手指按下触摸到的是那个菜单
     * 当在down事件时调用该方法
     *
     * @param ev
     * @param dx
     * @return
     */
    public View getTouchView(MotionEvent ev, int dx) {
        if (!twoMenuIsOpen && !threeMenuIsOpen) {
            //当二级菜单和三级菜单都处于关闭状态时
            nowState = ALL_CLOSE;
            return oneMenuView;
        } else if (twoMenuIsOpen && !threeMenuIsOpen) {
            //当二级菜单处于打开并且三级菜单处于关闭时
            nowState = TWO_OPEN;
            return dx < twoMenuViewLeft ? oneMenuView : twoMenuView;
        } else if (twoMenuIsOpen && threeMenuIsOpen) {
            nowState = TWO_THREE_OPEN;
            if (dx < twoMenuViewLeft) {
                return oneMenuView;
            } else if (dx > twoMenuViewLeft && threeMenuViewLeft > dx) {
                return twoMenuView;
            } else if (dx > threeMenuViewLeft) {
                return threeMenuView;
            }
        }
        return null;
    }


    /**
     * 获取手机屏幕宽高
     *
     * @return
     */
    public int[] getScreenSize() {
        Resources resources = this.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        int width = dm.widthPixels;//获得的是PX 需转换为dp
        int height = dm.heightPixels;
        int[] ScreenSize = {width, height};
        return ScreenSize;
    }

    @Override
    public void computeScroll() {
        //是否固定
        if (viewDragHelper.continueSettling(true)) {
            //该方法作用和invalidate()一样,但是用invalidate()方法有的机型没有效果,所以建议使用以下方法
            ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
        }
        if (viewDragHelper2.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
        }
    }

    /**
     * 当二级菜单和三级菜单都关闭时,点击listView item 相应的事件
     */

    public void OnClickOneMenu() {
        if (nowState == TWO_THREE_OPEN) {
            viewDragHelper.smoothSlideViewTo(threeMenuView, creenWidth + 10, 0);
            ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
            threeMenuViewLeft = creenWidth + DensityUtil.dip2px(context, 10);
            twoMenuIsOpen = true;
            threeMenuIsOpen = false;
            nowState = TWO_OPEN;
            return;
        }

        twoMenuViewLeft = (int) (creenWidth * 0.2 + 0.5) - 20;//获取屏幕的1/5
        viewDragHelper.smoothSlideViewTo(twoMenuView, twoMenuViewLeft, 0);
        ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
        twoMenuIsOpen = true;//当前为二级菜单打开状态,打上标志
        nowState = TWO_OPEN;


    }

    /**
     * 点击二级菜单是相应的事件
     */
    public void OnClickTwoMenu() {
        threeMenuViewLeft = (int) (creenWidth * 0.45 + 0.5);
        viewDragHelper.smoothSlideViewTo(threeMenuView, threeMenuViewLeft, 0);
        ViewCompat.postInvalidateOnAnimation(SeekProductMenu.this);
        threeMenuIsOpen = true;//标注三级菜单为打开状态
        nowState = TWO_THREE_OPEN;
    }

    class ViewHolder {
        TextView textView;
    }

    class MyCallBack extends ViewDragHelper.Callback {
        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            return true;
        }
    }

    private RecoverListViewItemBackground recoverListViewItemBackground;

    public void setOnRecoverListViewItemBackgroundListener(RecoverListViewItemBackground recoverListViewItemBackground) {
        this.recoverListViewItemBackground = recoverListViewItemBackground;
    }

    /**
     * 接口回调恢复listView item的背景颜色
     */
    public interface RecoverListViewItemBackground {
        void onRecoverOneListViewItemBackgroundListener();//恢复一级菜单item默认背景回调

        void onRecoverTwoListViewItemBackgroundListener();//恢复二级菜单item默认背景回调
    }

    private ListViewChangeListener listViewChangeListener;

    public void setOnListViewChangeListener(ListViewChangeListener listViewChangeListener) {
        this.listViewChangeListener = listViewChangeListener;
    }

    public interface ListViewChangeListener {
        void threeListViewChangeListener(boolean isOpen);

        void twoListViewChangeListener(boolean isOpen);
    }
}

上布局文件

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

    <com.example.jzg.mvpdemo.view.SeekProductMenu
        android:id="@+id/seek"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/green_wathet_textcolor">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/make_recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
        </FrameLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/login_btn_clr">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/model_recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
        </FrameLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/zi_wathet_textcolor">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/style_recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
        </FrameLayout>
    </com.example.jzg.mvpdemo.view.SeekProductMenu>

    <com.example.jzg.mvpdemo.view.LetterBarView
        android:id="@+id/index_list"
        android:layout_width="30dip"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="2dip"
        android:layout_marginTop="2dip"
        android:background="#40000000"></com.example.jzg.mvpdemo.view.LetterBarView>
</RelativeLayout>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,721评论 1 92
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,335评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,976评论 4 60
  • 秋风凉凉,跟豆豆嫲嫲一起带豆豆去老祖母的果园菜地摘菜!老祖母种了一大片的菜,有花生,有番薯,有芥菜,有萝卜。远近有...
    浣熊猫阅读 216评论 0 1