Android 自定義View學(xué)習(xí)(十四)——View滑動(dòng)學(xué)習(xí)

學(xué)習(xí)資料:

  • Android群英傳
  • Android藝術(shù)探索

滑動(dòng)效果就是實(shí)現(xiàn)動(dòng)態(tài)修改一個(gè)View的坐標(biāo)。
實(shí)現(xiàn)滑動(dòng)效果的基本思想:
手指落在屏幕觸控屏幕時(shí),系統(tǒng)記下當(dāng)前的觸摸點(diǎn)坐標(biāo);手指在屏幕移動(dòng)時(shí),系統(tǒng)記下移動(dòng)后的觸摸點(diǎn)坐標(biāo),獲取到每一次相對(duì)前一次觸摸點(diǎn)坐標(biāo)的偏移量,通過(guò)偏移量來(lái)修改View的坐標(biāo),不斷重復(fù),實(shí)現(xiàn)整個(gè)滑動(dòng)過(guò)程

1.系統(tǒng)輔助類 <p>

MotionEvent一樣,滑動(dòng)事件系統(tǒng)還提供了另外一些類


1.1 TouchSlop最小距離 <p>

TouchSlop是系統(tǒng)識(shí)別最小的滑動(dòng)距離,是一個(gè)常量值。當(dāng)手指在屏幕滑動(dòng)距離小于這個(gè)值時(shí),系統(tǒng)不會(huì)將動(dòng)作視為滑動(dòng)。這個(gè)常量值的具體大小和設(shè)備也有關(guān),不同的屏幕分辨率,可能會(huì)不一樣

獲得方式:

ViewContfiguration.get(getConetxt()).getScaledTouchSlop()

利用這個(gè)臨界值,可以將一些不想要的手指操作給過(guò)濾掉


1.2 VelocityTracker 速度追蹤 <p>

用于追蹤手指在滑動(dòng)過(guò)程中的速度,包括水平速度和豎直方向的速度

使用過(guò)程:

  • 第1步,在View.onToucheEvent()獲取VelocityTracker對(duì)象
  • 第2步,使用拿到的VelocityTracker對(duì)象來(lái)計(jì)算x,y軸方向的速度
  • 第3步,在比較恰當(dāng)及時(shí)的時(shí)機(jī),將VelocityTracker對(duì)象釋放掉,回收內(nèi)存

代碼:

public class ScrollerActivity extends AppCompatActivity {
    private VelocityTracker velocityTracker;
    private final String TAG = "ScrollerActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scroller);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //獲取VelocityTracker
        velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
        //計(jì)算滑動(dòng)速度
        velocityTracker.computeCurrentVelocity(1000);//計(jì)算速度
        float xVelocity = velocityTracker.getXVelocity();
        float yVelocity = velocityTracker.getYVelocity();
        Log.e(TAG,"&&&-->x = "+xVelocity+"---> y = "+yVelocity);
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != velocityTracker){
            velocityTracker.clear();//重置
            velocityTracker.recycle();//回收內(nèi)存
        }
    }
}

直接在Acvitity測(cè)試,獲取速度的結(jié)果,

  • x軸速度,從左向右滑動(dòng)時(shí),速度為正,從右向左滑動(dòng)為負(fù);
  • x軸速度,從上向下滑動(dòng)時(shí),速度為正,從下向上滑動(dòng)為負(fù);

正負(fù)值就是要看滑動(dòng)的方向和x,y軸方向是否一致


注意:
在使用velocityTracker.getXVelocity(),velocityTracker.getYVelocity()獲取速度之前,要先根據(jù)設(shè)置的單位時(shí)間來(lái)計(jì)算速度。計(jì)算公式v = (終點(diǎn)- 起點(diǎn)) /t。計(jì)算出來(lái)的速度是相對(duì)于設(shè)置的時(shí)間的。

計(jì)算出來(lái)的速度指的是一段時(shí)間內(nèi)滑過(guò)的像素?cái)?shù)。

velocityTracker.computeCurrentVelocity(t)

t = 1000,在1000ms內(nèi),假設(shè)勻速水平滑過(guò)了1000px,水平速度就是1000,也就是1000px/1000ms
t = 100,在100ms內(nèi),假設(shè)勻速水平滑過(guò)了100px,水平速度就是100,也就是100px/100ms


1.3 GestureDetector 手勢(shì)檢測(cè) <p>

用于輔助檢測(cè)單擊、滑動(dòng)、長(zhǎng)按、雙擊

使用步驟:

  • 第1步:創(chuàng)建GestureDetector對(duì)象,并實(shí)現(xiàn)OnGestureListener接口。
  • 第2步:接管目標(biāo)ViewonTouhEvent方法

GestureDetector.setOnDoubleTapListener(onDoubleTapListener)可以實(shí)現(xiàn)雙擊

Activicty為目標(biāo)View代碼:

public class ScrollerActivity extends AppCompatActivity {
    private Toast toast;
    private GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scroller);
        initGestureDetector();
    }

    /**
     * 初始化 GestureDetector
     */
    private void initGestureDetector() {
        mGestureDetector = new GestureDetector(ScrollerActivity.this,onGestureListener );
        //解決屏幕長(zhǎng)按后無(wú)法拖動(dòng)
        mGestureDetector.setIsLongpressEnabled(false);
    }

    private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.OnGestureListener() {
        @Override
        public boolean onDown(MotionEvent e) {//手指輕觸屏幕的一瞬間,由一個(gè)ACTION_DOWN觸發(fā)
            showToast("輕觸一下");
            return true;
        }

        @Override
        public void onShowPress(MotionEvent e) {//手指輕觸屏幕,尚未松開(kāi)或拖動(dòng),由一個(gè)ACTION_DOWN觸發(fā)
            showToast("輕觸未松開(kāi)");
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {//手指離開(kāi)屏幕,伴隨一個(gè)ACTION_UP觸發(fā),單擊行為
            showToast("單擊");
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//手指按下屏幕并拖動(dòng)
            // 由一個(gè)由一個(gè)ACTION_DOWN,多個(gè)ACTION_MOVE觸發(fā),是拖動(dòng)行為
            showToast("拖動(dòng)");
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {//長(zhǎng)按
            showToast("長(zhǎng)按");
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            //按下屏幕,快速滑動(dòng)后松開(kāi),由一個(gè)由一個(gè)ACTION_DOWN,多個(gè)ACTION_MOVE,一個(gè)ACTION_UP觸發(fā)
            showToast("快速滑動(dòng)");
            return false;
        }
    };

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean consume = mGestureDetector.onTouchEvent(event);
        return consume;
    }

    /**
     * Toast
     */
    private void showToast(String str) {
        if (null == toast) {
            toast = Toast.makeText(ScrollerActivity.this, str, Toast.LENGTH_LONG);
        } else {
            toast.setText(str);
        }
        toast.show();
    }
}

OnGestureListener內(nèi)onDown(),onSingleTapUp(),onScroll(),onFling()方法都有一個(gè)boolean類型的返回值,這個(gè)值表示是否消費(fèi)事件


1.4 Scroller 彈性滑動(dòng)對(duì)象 <p>

用于實(shí)現(xiàn)View的彈性滑動(dòng)。Scroller本身無(wú)法實(shí)現(xiàn)彈性滑動(dòng),需要配合ViewcomputeScroll()方法

Scroller使用有個(gè)固定的3步走模式:

  1. 初始化Scroller對(duì)象
  2. 重寫ViewcomputeScroll()方法
  3. 調(diào)用mScroller.startScroll()方法

簡(jiǎn)單使用:

public class ScrollerView extends LinearLayout {
    private Scroller mScroller;

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

    /**
     * 初始化Scroller
     */
    private void initScroller() {
        mScroller = new Scroller(getContext());
    }

    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mScroller.computeScrollOffset()) {//判斷Scroller是否執(zhí)行完畢
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
    }

    public void smoothScrollTo(int destX, int destY) {
        //計(jì)算相對(duì)于左上角的偏移量
        final int deltaX = getScrollX() - destX;
        final int deltaY = getScrollY() - destY;
        //在1000ms內(nèi)滑向destX destY
        mScroller.startScroll(0, 0, deltaX, deltaY, 1000);
        invalidate();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                smoothScrollTo((int) event.getX(), (int) event.getY());
                break;
            case MotionEvent.ACTION_UP://恢復(fù)左上角
                mScroller.startScroll(getScrollX(), getScrollY(), -getScrollX(), -getScrollY(), 1000);
                invalidate();
                break;
        }
        return true;
    }
}

效果便是手指點(diǎn)在屏幕哪里,一秒內(nèi),ScrollerView內(nèi)的所有子控件便會(huì)滑動(dòng)到手指落的點(diǎn)的位置

關(guān)于Scroller這里先了解一點(diǎn)點(diǎn),打算之后再單獨(dú)來(lái)學(xué)習(xí)


2.實(shí)現(xiàn)滑動(dòng)的7種方法 <p>

Android群英傳中,徐醫(yī)生給出7種滑動(dòng)方法:

  1. layout方法
  2. offsetLetAndRight()和offsetTopAndBottom()
  3. LayoutParams
  4. scrollTo和scrollBy
  5. Scroller
  6. 屬性動(dòng)畫(huà)
  7. ViewDragHelper

5上面剛剛有了解,以后還會(huì)繼續(xù)補(bǔ)充學(xué)習(xí),6Android動(dòng)畫(huà)基礎(chǔ)知識(shí)學(xué)習(xí)(下)學(xué)習(xí)了解過(guò)。1234在本篇會(huì)學(xué)習(xí)了解,這幾個(gè)方法感覺(jué)效果都不是很好,滑動(dòng)效果很突兀,最重要的便是方法7,下篇單獨(dú)來(lái)學(xué)習(xí)


2.1ayout方法

View進(jìn)行繪制時(shí),會(huì)調(diào)用onLayout()方法來(lái)設(shè)置顯示的位置

代碼:

public class ScrollerView extends LinearLayout {

    private float lastX, lastY;

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                //計(jì)算偏移量
                float offsetX = x - lastX;
                float offsetY = y - lastY;
                //計(jì)算四個(gè)頂點(diǎn)的位置
                int left = (int) (getLeft() + offsetX);
                int top = (int) (getTop() + offsetY);
                int right = (int) (getRight() + offsetX);
                int bottom = (int) (getBottom() + offsetY);
                //布局回調(diào)
                layout(left, right, top, bottom);
                break;
        }
        return true;
    }
}

不曉得是我代碼有問(wèn)題還是這個(gè)思路本身有問(wèn)題,體驗(yàn)非常不好,childView在滑動(dòng)過(guò)程中,大小會(huì)發(fā)生改變


2.2 offsetLeftAndRight和offsetTopAndBottom <p>

系統(tǒng)提供的對(duì)左右上下移動(dòng)的API的封裝,效果和使用與layout方法類似

layout方法代碼簡(jiǎn)單修改:

case MotionEvent.ACTION_MOVE:
    //計(jì)算偏移量
    float offsetX = x - lastX;
    float offsetY = y - lastY;
    Log.e("offset","&&&--"+offsetX+"-->"+offsetY);
    offsetLeftAndRight((int)offsetX);
    offsetTopAndBottom((int)offsetY);
break;

子控件會(huì)隨著手指在屏幕滑動(dòng)而滑動(dòng)

offset有效區(qū)域

這個(gè)方法遇到個(gè)問(wèn)題,有些區(qū)域無(wú)效,只有黃色邊框內(nèi)才有效


2.3 LayoutParams 布局參數(shù) <p>

LayoutParams保存了一個(gè)View的布局參數(shù)。可以通過(guò)LayoutParams來(lái)動(dòng)態(tài)地修改一個(gè)布局的位置參數(shù)。

簡(jiǎn)單的修改代碼:

 case MotionEvent.ACTION_MOVE:
    //計(jì)算偏移量
    float offsetX = x - lastX;
    float offsetY = y - lastY;
    Log.e("offset", "&&&--" + offsetX + "-->" + offsetY);
    MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
    layoutParams.leftMargin = (int) (getLeft() + offsetX);
    layoutParams.topMargin = (int) (getTop() + offsetY);
    setLayoutParams(layoutParams);
break;

同樣有一個(gè)有效區(qū)域的問(wèn)題


2.4 使用scrollTo或者scrollBy <p>

兩個(gè)方法區(qū)別: scrollBy()相對(duì)移動(dòng),scrollTo()絕對(duì)移動(dòng)

View內(nèi)部有兩個(gè)屬性mScrllXmScrollY,分別可以通過(guò)getScrollX()getScrollY()方法得到

在滑動(dòng)過(guò)程中,mScrollX總是等于View左邊緣和View內(nèi)容左邊緣在水平方方向的距離;mScrollY總是等于View上邊緣和View中內(nèi)容上邊緣在豎直方向的距離。View邊緣是指View的位置也就是View的四個(gè)頂點(diǎn)到父容器的距離,View內(nèi)邊緣是內(nèi)容距離View四邊的距離。

無(wú)論是scrollTo()還是scrollBy()都只能改變View內(nèi)容的位置而不能改變View在布局中的位置

mScrollX/Y單位為像素px。當(dāng)View左邊緣在View內(nèi)容左邊緣右邊時(shí),mScrollX為正值,反之為負(fù)值;同理,當(dāng)View上邊緣在View內(nèi)容上邊緣下邊時(shí),mScrollX為正值,反之為負(fù)值。也就是說(shuō),View從左向右滑動(dòng),mScrollX為負(fù)值,反之為正值;從上往下滑動(dòng),mScrollY為負(fù)值,反之為正值

mScrollX和mScrollY變換規(guī)律

白色為View原始位置,紫色矩形為內(nèi)容


簡(jiǎn)單使用:

 case MotionEvent.ACTION_MOVE:
    //計(jì)算偏移量
    float offsetX = x - lastX;
    float offsetY = y - lastY;
    Log.e("offset", "&&&--" + offsetX + "-->" + offsetY);
    //scrollBy((int)-offsetX,(int)-offsetY);
    scrollTo((int)-offsetX,(int)-offsetY);
    break;

根據(jù)規(guī)律圖,手勢(shì)和實(shí)際移動(dòng)方向相反,在設(shè)置參數(shù)時(shí),設(shè)置為了-offsetX


幾種方式,簡(jiǎn)單總結(jié)

  • scrollTo/By:操作簡(jiǎn)單,適合對(duì)View內(nèi)容的滑動(dòng)
  • 屬性動(dòng)畫(huà):操作簡(jiǎn)單,適用于沒(méi)交互View和實(shí)現(xiàn)復(fù)雜的動(dòng)畫(huà)效果
  • 改變布局參數(shù):操作復(fù)雜,適用于有交互的View

3. 滑動(dòng)沖突

滑動(dòng)沖突常見(jiàn)的場(chǎng)景:

  1. 外部滑動(dòng)方向和內(nèi)部滑動(dòng)方向不一致
  2. 外部滑動(dòng)方向和內(nèi)部滑動(dòng)方向一致
  3. 上面兩種情況嵌套
滑動(dòng)沖突

解決方式有兩種:外部攔截,內(nèi)部攔截


3.1 外部攔截 <p>

外部攔截思路:
點(diǎn)擊事件都會(huì)先經(jīng)過(guò)父容器的攔截處理,如果父容器需要處理此事就攔截,否則就不進(jìn)行攔截。重寫父容器的onInterceptTouchEvent()方法

偽碼:

public boolean onInterceptTouchEvent(MotionEvent event){
       boolean intercepted = false;
       int x = (int) event.getX();
       int y = (int) event.getY();
       switch(event.getAction()){
             case MotionEvent.ACTION_MOVE:
                  intercepted = true;
             break;
             case MotionEvent.Move:
                  if(父容器需要當(dāng)前點(diǎn)擊事件){
                     intercepted = true;
                  }else{
                     intercepted = false; 
                  }
             break;
             case MotionEvent.ACTION_UP:
                  intercepted = false;
             break;
      }
      mLastXIntercept = x;
      mLastYIntercept = y;
      return intercepted;
}

處理思路代碼基本都是固定的。
首先,在ACTION_DOWN中,父容器必須返回false,不攔截ACTION_DOWN事件。因?yàn)橐坏r截了ACTION_DOWN后續(xù)的ACTION_MOVEACTION_UP都會(huì)又父容器來(lái)處理,這樣事件就無(wú)法傳遞給childView
其次,在ACTION_MOVE中,可以根據(jù)需要來(lái)進(jìn)行攔截,需要就返回true,否則就false
最后,在ACTION_UP中,返回false


注意:
如果父容器在ACTION_UP中,返回了truechildView就不會(huì)再收到ACTION_UP事件,childViewonClick事件就不會(huì)觸發(fā)。父容器比較特殊,一旦開(kāi)始攔截某個(gè)事件,之后的序列事件都是交給父容器來(lái)處理,包括ACTION_UP,即使在ACTION_UP中返回falseACTION_UP還是由父容器處理


3.2 內(nèi)部攔截 <p>

內(nèi)部攔截法指的是父容器不攔截任何事件,所有的事件都傳遞給childView,根據(jù)需要,childView來(lái)選擇是否消費(fèi),需要配合requestDisallowInterceptTouchEvent()方法。重寫childViewdispatchTouchEvent()方法

偽碼:

public boolean dispatchTouchEvent(MotionEvent event){
       int x = (int) event.getX();
       int y = (int) event.getY();
       switch(event.getAction()){
          case MotionEvent.ACTION_DOWN:
               parent.requestDisallowInterceptTouchEvent(true);
          break;
          case MotionEvent.ACTION_MOVE:
               int deltaX = x - mLastX;
               int deltaY = y - mLastY;
               if(父容器需要此類點(diǎn)擊事件){
                   parent.requestDisallowInterceptTopuchEvent(false);
               }
          break;
          case MotionEvent.ACTION_UP:
               break;
          break;
       }
       mLastX = x ;
       mLastY = y ;
       return super.dispatchTouchEvent(event);
}

使用稍微比外部麻煩。

ACTION_DOWN中,使用parent.requestDisallowInterceptTouchEvent(true),讓父容器不攔截ACTION_DOWN事件,ACTION_DOWN不受FLAG_DISALLOW_INTERCEPT標(biāo)記位控制


4.最后 <p>

國(guó)慶放假在家的效率有些低,事有點(diǎn)多。農(nóng)村娃,還下地干了會(huì)活,哈哈。打算將自定義系列結(jié)束呢,完不成不計(jì)劃了。按照學(xué)習(xí)計(jì)劃,還剩下2篇學(xué)習(xí)內(nèi)容

本人很菜,有錯(cuò)誤請(qǐng)指出

共勉 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,740評(píng)論 3 420
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,856評(píng)論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,175評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,931評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,321評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,533評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,082評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,891評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,319評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,732評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,987評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,794評(píng)論 3 394
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,076評(píng)論 2 375

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