Material Design - Behavior

關(guān)鍵字:Behavior锹雏、材料設(shè)計(jì)
項(xiàng)目地址:AboutMaterialDesign


大多數(shù)情況下轻绞,我們的項(xiàng)目只需要用到材料設(shè)計(jì)的 Toolbar DrawerLayout TabLayout 等等現(xiàn)成的控件就可以了奸远,使用方便芍瑞,也允許我們有不同程度的自定義優(yōu)化。但是一旦業(yè)務(wù)對于界面的交互有更明確的要求屑那,上面的控件就變得不再那么夠用益眉。材料設(shè)計(jì)為我們提供了協(xié)調(diào)者布局 CoordinatorLayout 用于聯(lián)系所有子控件姥份,使得子控件之間在保持相對獨(dú)立的同時(shí)郭脂,又能相互影響,適時(shí)變化澈歉。

而這一切除了要感謝 CoordinatorLayout 的出現(xiàn)展鸡,還要記得 Google 工程師在 Behavior 上的付出。


學(xué)習(xí) Behavior 就是學(xué)習(xí)一點(diǎn):根據(jù)監(jiān)聽得到合適的時(shí)機(jī)去修改目標(biāo)視圖的狀態(tài)埃难。
帶著這樣的學(xué)習(xí)目的莹弊,我們?nèi)ゲ榭聪嚓P(guān)代碼涤久,會容易很多。

根據(jù)文檔箱硕,我們可以知道拴竹,Behavior 是 CoordinatorLayout 的一個(gè)內(nèi)部類。

Interaction behavior plugin for child views of {@link CoordinatorLayout}.
A Behavior implements one or more interactions that a user can take on a child view.
These interactions may include drags, swipes, flings, or any other gestures.

一剧罩、使用自帶的 Behavior

由于大會影響栓拜,翻不了墻,因此只揀了我記得的 BottomSheetBehaviorSwipeDismissBehavior 來寫惠昔。

1) BottomSheetBehavior
GIF.gif

BottomSheetBehavior 一共有五個(gè)狀態(tài)幕与,上面的效果為 BottomSheetBehavior 對應(yīng)的三個(gè)狀態(tài):

    /**
     * The bottom sheet is dragging.
     */
    public static final int STATE_DRAGGING = 1;

    /**
     * The bottom sheet is settling.
     */
    public static final int STATE_SETTLING = 2;

    /**
     * The bottom sheet is expanded.
     */
    public static final int STATE_EXPANDED = 3;

    /**
     * The bottom sheet is collapsed.
     */
    public static final int STATE_COLLAPSED = 4;

    /**
     * The bottom sheet is hidden.
     */
    public static final int STATE_HIDDEN = 5;

實(shí)現(xiàn)上面的效果很簡單,只需要在以 CoordinatorLayout 為根節(jié)點(diǎn)的布局文件中增加一個(gè)容器放置彈框的內(nèi)容镇防,然后在容器根節(jié)點(diǎn)下新增屬性:

app:behavior_hideable="true"
app:behavior_peekHeight="100dp"
app:layout_behavior="@string/bottom_sheet_behavior"

其中

  • layout_behavior 用于指定容器指定的 Behavior 啦鸣,在使用自定義 Behavior 的時(shí)候,也可以通過這個(gè)方法来氧,將視圖和 Behavior 關(guān)聯(lián)
  • behavior_peekHeight 用于指定視圖折疊時(shí)顯示的高度
  • behavior_hideable 用于指定視圖是否可以完全隱藏
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >
 
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:behavior_hideable="true"
        app:behavior_peekHeight="50dp"
        app:layout_behavior="@string/bottom_sheet_behavior"
        >
          <!-- NestedScrollView里設(shè)置你的底部表長什么樣的-->
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

代碼中需要注意這樣幾個(gè)方法:

//1.動(dòng)態(tài)設(shè)置 Behavior
BottomSheetBehavior behavior = new BottomSheetBehavior();
behavior.setPeekHeight(100);
behavior.setHideable(true);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        //狀態(tài)變化時(shí)調(diào)用
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        //滑動(dòng)時(shí)調(diào)用诫给,可以根據(jù) slideOffset 配置動(dòng)畫效果
    }
});

//2.獲取 xml 中設(shè)置的 behavior 并設(shè)置相關(guān)屬性
View bottomSheet = findViewById(R.id.bottom_sheet);
if (bottomSheet != null) {
    behavior = BottomSheetBehavior.from(bottomSheet);
    behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

//3.獲取當(dāng)前狀態(tài)
int state = behavior.getState();
2) SwipeDismissBehavior

在 xml 布局文件中,利用聯(lián)想并沒有跳出這個(gè) Behavior啦扬。但是在 Java 代碼中中狂,我們還是可以找到這個(gè)類的。

SwipeDismissBehavior<View> behavior = new SwipeDismissBehavior<>();
behavior.setSwipeDirection(SWIPE_DIRECTION_START_TO_END);
//behavior.setDragDismissDistance(0.5f);//
//behavior.setStartAlphaSwipeDistance(0.1f);//設(shè)置拖動(dòng)的有效距離扑毡,即開始透明消失的距離
//behavior.setEndAlphaSwipeDistance(0.7f);//完全消失時(shí)候的距離
//behavior.setSensitivity(0.5f);//敏感度
behavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
    @Override
    public void onDismiss(View view) {
        Log.d(TAG, "onDismiss: ");
    }

    @Override
    public void onDragStateChanged(int state) {
        Log.d(TAG, "onDragStateChanged: ");
    }
});
((CoordinatorLayout.LayoutParams) mTextView.getLayoutParams()).setBehavior(behavior);
GIF.gif

二胃榕、自定義簡單 Behavior

下面貼出大部分可重寫方法的代碼:

public class TestBehavior extends CoordinatorLayout.Behavior<View> {
    private static final String TAG = "TestBehavior";

    public TestBehavior() {
        super();
        Log.i(TAG, "TestBehavior(1): ");
    }

    public TestBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.i(TAG, "TestBehavior(2): ");
    }

    //--------------------[布局事件 start]-----------------------------------------------
    @Override
    public void onAttachedToLayoutParams(@NonNull CoordinatorLayout.LayoutParams params) {
        super.onAttachedToLayoutParams(params);
        Log.i(TAG, "onAttachedToLayoutParams: ");
    }

    @Override
    public void onDetachedFromLayoutParams() {
        super.onDetachedFromLayoutParams();
        Log.i(TAG, "onDetachedFromLayoutParams: ");
    }

    @Override
    public boolean onMeasureChild(CoordinatorLayout parent, View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
        Log.i(TAG, "onMeasureChild: ");
        return super.onMeasureChild(parent, child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
    }

    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) {
        Log.i(TAG, "onLayoutChild: ");
        return super.onLayoutChild(parent, child, layoutDirection);
    }
    //--------------------[布局事件 end]-----------------------------------------------
    
    //--------------------[觸摸事件 start]-----------------------------------------------
    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) {
        Log.i(TAG, "onInterceptTouchEvent: ");
        return super.onInterceptTouchEvent(parent, child, ev);
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) {
        Log.i(TAG, "onTouchEvent: ");
        return super.onTouchEvent(parent, child, ev);
    }
    //--------------------[觸摸事件 end]-----------------------------------------------

    //--------------------[狀態(tài)改變事件 start]-----------------------------------------------
    @Override
    public int getScrimColor(CoordinatorLayout parent, View child) {
        Log.i(TAG, "getScrimColor: ");
        return super.getScrimColor(parent, child);
    }

    @Override
    public float getScrimOpacity(CoordinatorLayout parent, View child) {
        Log.i(TAG, "getScrimOpacity: ");
        return super.getScrimOpacity(parent, child);
    }

    @Override
    public boolean blocksInteractionBelow(CoordinatorLayout parent, View child) {
        Log.i(TAG, "blocksInteractionBelow: ");
        return super.blocksInteractionBelow(parent, child);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        Log.i(TAG, "layoutDependsOn: dependency=="+dependency.getClass().getSimpleName());
        return super.layoutDependsOn(parent, child, dependency);
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        Log.i(TAG, "onDependentViewChanged: dependency=="+dependency.getClass().getSimpleName());
        return super.onDependentViewChanged(parent, child, dependency);
    }

    @Override
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
        Log.i(TAG, "onDependentViewRemoved: dependency=="+dependency.getClass().getSimpleName());
        super.onDependentViewRemoved(parent, child, dependency);
    }
    //--------------------[狀態(tài)改變事件 end]-----------------------------------------------

    //--------------------[滑動(dòng)事件 start]-----------------------------------------------
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        Log.i(TAG, "onStartNestedScroll: ");
        return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        Log.i(TAG, "onNestedScrollAccepted: ");
        super.onNestedScrollAccepted(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) {
        Log.i(TAG, "onStopNestedScroll: ");
        super.onStopNestedScroll(coordinatorLayout, child, target);
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        Log.i(TAG, "onNestedScroll: ");
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
        Log.i(TAG, "onNestedPreScroll: ");
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) {
        Log.i(TAG, "onNestedFling: ");
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
        Log.i(TAG, "onNestedPreFling: ");
        return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }
    //--------------------[滑動(dòng)事件 end]-----------------------------------------------
}

而我們的需求通常集中在這幾個(gè)方法中:

//監(jiān)聽狀態(tài)的改變 返回是否調(diào)用 onDependentViewChanged 方法
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
    Log.i(TAG, "layoutDependsOn: dependency=="+dependency.getClass().getSimpleName());
    return super.layoutDependsOn(parent, child, dependency);
}

//監(jiān)聽狀態(tài)的改變 反饋方法
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
    Log.i(TAG, "onDependentViewChanged: dependency=="+dependency.getClass().getSimpleName());
    return super.onDependentViewChanged(parent, child, dependency);
}

//監(jiān)聽滑動(dòng),返回 true 時(shí)調(diào)用 onNestedScroll 等一系列方法
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild,
                                   View target, int nestedScrollAxes) {
    return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
}

/**
 *  正在滾動(dòng) 反饋方法
 *
 * 這里我們只關(guān)心y軸方向的滑動(dòng)瞄摊,所以簡單測試了dyConsumed勋又、dyUnconsumed
 * dyConsumed > 0 && dyUnconsumed == 0 上滑中
 * dyConsumed == 0 && dyUnconsumed > 0 到邊界了還在上滑
 *
 * dyConsumed < 0 && dyUnconsumed == 0 下滑中
 * dyConsumed == 0 && dyUnconsumed < 0 到邊界了還在下滑
 *
 * @param coordinatorLayout     parent
 * @param child                 child
 * @param target                dependency
 * @param dxConsumed            x軸滑動(dòng)的距離
 * @param dyConsumed            y軸滑動(dòng)的距離
 * @param dxUnconsumed          到頂之后滑動(dòng)的距離
 * @param dyUnconsumed          到頂之后滑動(dòng)的距離
 */
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
    Log.i(TAG, String.format("onNestedScroll: dxConsumed==%d,dyConsumed==%d,dxUnConsumed==%d,dyUnConsumed==%d", dxConsumed,dyConsumed,dxUnconsumed,dyUnconsumed));
}

實(shí)現(xiàn)效果:視圖 child 隨 dependency 的改變而改變

GIF.gif

這個(gè)效果是拖拽 dependency 的時(shí)候,目標(biāo)視圖會按照預(yù)設(shè)的規(guī)則變化位置换帜。

思路:

  • 自定義一個(gè) Behavior 重寫 layoutDependsOn 和 onDependentViewChanged 方法
  • 在 layoutDependsOn 中楔壤,判斷該 dependency 是否為我們指定的視圖
  • 在 onDependentViewChanged 設(shè)置目標(biāo)視圖的改變規(guī)則

下面貼上測試 Behavior 代碼:

public class TestDragBehavior extends CoordinatorLayout.Behavior<View> {
    private static final String TAG = "TestDragBehavior";
    private int width;
    private int height;

    /**
     * 這個(gè)構(gòu)造方法必須重載,因?yàn)樵贑oordinatorLayout里利用反射去獲取Behavior的時(shí)候就是拿的這個(gè)構(gòu)造
     */
    public TestDragBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        width  = context.getResources().getDisplayMetrics().widthPixels;
        height  = context.getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 是否調(diào)用 onDependentViewChanged
     * @param parent        父容器
     * @param child         子視圖
     * @param dependency    依賴視圖
     * @return              是否依賴
     */
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof DragText;
    }

    /**
     * 在這里我們定義 child 要執(zhí)行的具體動(dòng)作
     * @return  child是否要執(zhí)行相應(yīng)動(dòng)作
     */
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {

        int top = dependency.getTop();
        int left = dependency.getLeft();

        int x = width - left - child.getWidth();
        int y = height - top - child.getHeight();

        setPosition(child, x, y);

        return true;
    }

    private void setPosition(View child, int x, int y) {
        CoordinatorLayout.MarginLayoutParams layoutParams = (CoordinatorLayout.MarginLayoutParams) child.getLayoutParams();
        layoutParams.leftMargin = x;
        layoutParams.topMargin = y;
        child.setLayoutParams(layoutParams);
    }

}

實(shí)現(xiàn)效果:視圖 child 隨 dependency 滾動(dòng)狀態(tài)的改變而改變

GIF.gif

下面貼上測試 Behavior 代碼:

public class TestScrollBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
    private static final String TAG = "TestScrollBehavior";
    
    public TestScrollBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 監(jiān)聽滾動(dòng)惯驼,返回是否調(diào)用 onNestedScroll 等監(jiān)聽代碼
     * @param coordinatorLayout
     * @param child
     * @param directTargetChild
     * @param target
     * @param nestedScrollAxes
     * @return
     */
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild,
                                       View target, int nestedScrollAxes) {
        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
    }

    /**
     * 正在滾動(dòng)
     *
     * 這里我們只關(guān)心y軸方向的滑動(dòng)蹲嚣,所以簡單測試了dyConsumed、dyUnconsumed
     * dyConsumed > 0 && dyUnconsumed == 0 上滑中
     * dyConsumed == 0 && dyUnconsumed > 0 到邊界了還在上滑
     *
     * dyConsumed < 0 && dyUnconsumed == 0 下滑中
     * dyConsumed == 0 && dyUnconsumed < 0 到邊界了還在下滑
     *
     * @param coordinatorLayout     parent
     * @param child                 child
     * @param target                dependency
     * @param dxConsumed            x軸滑動(dòng)的距離
     * @param dyConsumed            y軸滑動(dòng)的距離
     * @param dxUnconsumed          到頂之后滑動(dòng)的距離
     * @param dyUnconsumed          到頂之后滑動(dòng)的距離
     */
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        Log.i(TAG, String.format("onNestedScroll: dxConsumed==%d,dyConsumed==%d,dxUnConsumed==%d,dyUnConsumed==%d", dxConsumed,dyConsumed,dxUnconsumed,dyUnconsumed));

        if (((dyConsumed > 0 && dyUnconsumed == 0)
                || (dyConsumed == 0 && dyUnconsumed > 0))
                && child.getVisibility() != View.INVISIBLE) {// 上滑隱藏
            child.setVisibility(View.INVISIBLE);
        } else if (((dyConsumed < 0 && dyUnconsumed == 0)
                || (dyConsumed == 0 && dyUnconsumed < 0))
                && child.getVisibility() != View.VISIBLE ) {//下滑顯示
            child.setVisibility(View.VISIBLE);
        }

    }
}

實(shí)現(xiàn)效果:滑動(dòng)改變 top 布局位置

GIF.gif
/**
 * Created by Arno on 2017/10/24.
 *
 * 實(shí)現(xiàn)上滑滾出跳座,下滑跟進(jìn)的效果
 */
public class TestScrollBehavior2 extends CoordinatorLayout.Behavior<View>{
    private static final String TAG = "TestScrollBehavior2";
    private int offset = 0;
    /**
     * 必須重寫這個(gè)方法
     * @param context
     * @param attrs
     */
    public TestScrollBehavior2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
        return true;
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        int temp = offset;
        int top = offset - dyConsumed;

        //上滑
        if (dyConsumed > 0) {
            temp = Math.max(top,-child.getHeight());
        }

        //下滑
        if (dyConsumed < 0) {
            temp = Math.min(top,0);
        }

        child.offsetTopAndBottom(temp - offset);
        offset = temp;
    }

}

注意
上面大部分的點(diǎn)端铛,需要自行測試泣矛,這里放上代碼中獲取 Behavior 的方法(還找了一小會它藏哪里去了)疲眷,根據(jù)源碼可以看到,Behavior 被存儲在 CoordinatorLayout.LayoutParams 中您朽。

CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) bottomSheet.getLayoutParams()).getBehavior();

以上狂丝,謝謝觀賞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末换淆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子几颜,更是在濱河造成了極大的恐慌倍试,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛋哭,死亡現(xiàn)場離奇詭異县习,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谆趾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門躁愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沪蓬,你說我怎么就攤上這事彤钟。” “怎么了跷叉?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵逸雹,是天一觀的道長。 經(jīng)常有香客問我云挟,道長梆砸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任植锉,我火速辦了婚禮辫樱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俊庇。我一直安慰自己狮暑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布辉饱。 她就那樣靜靜地躺著搬男,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彭沼。 梳的紋絲不亂的頭發(fā)上缔逛,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音姓惑,去河邊找鬼褐奴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛于毙,可吹牛的內(nèi)容都是我干的敦冬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼唯沮,長吁一口氣:“原來是場噩夢啊……” “哼脖旱!你這毒婦竟也來了堪遂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤萌庆,失蹤者是張志新(化名)和其女友劉穎溶褪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践险,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猿妈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巍虫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于游。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垫言,靈堂內(nèi)的尸體忽然破棺而出贰剥,到底是詐尸還是另有隱情,我是刑警寧澤筷频,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蚌成,位于F島的核電站,受9級特大地震影響凛捏,放射性物質(zhì)發(fā)生泄漏担忧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一坯癣、第九天 我趴在偏房一處隱蔽的房頂上張望瓶盛。 院中可真熱鬧,春花似錦示罗、人聲如沸惩猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧房。三九已至,卻和暖如春绍绘,著一層夾襖步出監(jiān)牢的瞬間奶镶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工陪拘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厂镇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓左刽,卻偏偏與公主長得像捺信,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子悠反,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,708評論 22 664
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫残黑、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 介紹 用于CoordiantorLayout的子View的交互行為插件斋否。一個(gè)Behavior實(shí)現(xiàn)了用戶的一個(gè)或者多...
    hiandg閱讀 519評論 0 0
  • 初到一個(gè)工作單位茵臭,你對所有人都很好疫诽。同事請你幫忙,你哪怕自己很忙旦委,都會答應(yīng)奇徒。工作中你付出很多,你想擁有好的人際關(guān)系...
    優(yōu)媽要遠(yuǎn)行閱讀 576評論 0 2