Unity 按鈕控制ScrowView的腳本實(shí)現(xiàn)



using System;
/**
*Copyright(C) 2019 by #COMPANY#
*All rights reserved.
*FileName:     #SCRIPTFULLNAME#
*Author:       #AUTHOR#
*Version:      #VERSION#
*UnityVersion:#UNITYVERSION#
*Date:         #DATE#
*Description:   
*History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public enum ESVMoveType
{
    Horizontal = 0,
    Vertical
}

public class SVMove
{
    /// <summary>
    /// the firstStart do not Use HeadCallBack
    /// </summary>
    public Action correctionHeadCallBack;
    public Action correctionTailCallBack;
    /// <summary>
    /// the time with once move
    /// </summary>
    public float duration = 1f;
    Vector2 disNormalizedVe2;
    ScrollRect sv;
    bool isTail;

    ESVMoveType svType;
    /// <summary>
    /// set SV with scrowNum and type
    /// </summary>
    /// <param name="sv"></param>
    /// <param name="scrowNum">it can control moveNum with once move</param>
    /// <param name="type"></param>
    public SVMove(Transform sv, int scrowNum = 1, ESVMoveType type = ESVMoveType.Vertical)
    {
        this.sv = sv.GetComponent<ScrollRect>();
        svType = type;
        GetDistance(scrowNum);
    }

    /// <summary>
    /// Get the Distance with ScrowNum and Orientation
    /// </summary>
    /// <param name="scrowNum"></param>
    /// <param name="org"></param>
    public void GetDistance(int scrowNum)
    {
        var grid = sv.content.GetComponent<GridLayoutGroup>();
        switch (svType)
        {
            // scorwNum*one move long/contentLong(i can't get it,so i have to calculation)-svLong-gridDistance
            case ESVMoveType.Horizontal:
                float childWidth = grid.cellSize.x;
                float maxContentWidth = (childWidth + grid.spacing.x) * grid.transform.childCount - grid.padding.top - sv.GetComponent<RectTransform>().rect.width;
                float disWidth = (childWidth + grid.spacing.x) * scrowNum / maxContentWidth;
                disNormalizedVe2 = disWidth * Vector2.right;
                break;
            case ESVMoveType.Vertical:
                float childHeight = grid.cellSize.y;
                float maxContentHeight = (childHeight + grid.spacing.y) * grid.transform.childCount - grid.padding.left - sv.GetComponent<RectTransform>().rect.height;
                float disHeight = (childHeight + grid.spacing.y) * scrowNum / maxContentHeight;
                disNormalizedVe2 = disHeight * Vector2.up;
                break;
        }
    }

    /// <summary>
    /// Move Active Response, it always use one btn to contro
    /// </summary>
    public void Move()
    {
        float svNormalizedLong = GetSVNormalizedLong();

        if (svNormalizedLong <= 0)
            isTail = false;
        if (svNormalizedLong >= 1)
            isTail = true;

        if (isTail)
            DoForwardMove();
        else
            DoBackwordMove();
    }

    /// <summary>
    /// Forward move
    /// </summary>
    public void DoForwardMove()
    {
        Vector2 willPos = sv.normalizedPosition - disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);

        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);
        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
             {
                 Debug.Log(GetSVNormalizedLong());
                 //Correction the tail with End
                 if (GetSVNormalizedLong() <= 0.01)
                 {
                     if (correctionTailCallBack != null)
                         correctionTailCallBack();

                     isTail = false;
                 }
             });
    }

    /// <summary>
    /// Backword Move
    /// </summary>
    public void DoBackwordMove()
    {
        Vector2 willPos = sv.normalizedPosition + disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);
        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);

        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
       {
           Debug.Log(GetSVNormalizedLong());
           //Correction the head  with Start
           if (GetSVNormalizedLong() >= 0.99f)
           {
               if (correctionHeadCallBack != null)
                   correctionHeadCallBack();

               isTail = true;
           }
       });
    }

    /// <summary>
    /// chang the Orientation if you want  Backword start 
    /// </summary>
    public void ChangeOrientation()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                disNormalizedVe2.x *= -1;
                break;
            case ESVMoveType.Vertical:
                disNormalizedVe2.y *= -1;
                break;
        }
    }
    /// <summary>
    /// get the SVNormalizedLong with the type
    /// </summary>
    /// <param name="norLong"></param>
    public float GetSVNormalizedLong()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return sv.normalizedPosition.x;

            case ESVMoveType.Vertical:
                return sv.normalizedPosition.y;
        }
        return 0;
    }

    //get WillPos limit with movie
    public Vector2 MovieRangeLimit(Vector2 willPos)
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                if (willPos.x > 1)
                    willPos.x = 1;
                else if (willPos.x < 0)
                    willPos.x = 0;
                break;
            case ESVMoveType.Vertical:
                if (willPos.y > 1)
                    willPos.y = 1;
                else if (willPos.y < 0)
                    willPos.y = 0;
                break;
        }
        return willPos;
    }

    //limitd the Duaration with WillPos and CorrectPos,it can let movie become more smooth
    public float GetDuarationLimitWithDis(Vector2 willPos, Vector2 correctPos)
    {
        //if they are equal don't change
        if (willPos == correctPos)
            return duration;

        //get the perfect duaration,DuarationPos/beforePos,but you should to know when duaration was less than zero we will add it -1,
        //at the first time i want use Mathf.Abs(), but they can offset the negative 
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return (willPos.x - correctPos.x) / (willPos.x<0?willPos.x-1: willPos.x) * duration;
            case ESVMoveType.Vertical:
                return (willPos.y - correctPos.y) / (willPos.y < 0 ? willPos.y - 1 : willPos.y) * duration;
        }
        return duration;
    }
}

GIF.gif

GIF.gif

這是單個(gè)按鈕控制的 如果想兩個(gè)按鈕控制就要分別調(diào)用DoFofwordMove DoBackwordMove
腳本構(gòu)造傳入 ScrowView 和滾動(dòng)幅度 還有橫向移動(dòng)還是豎向移動(dòng)就可以了

然后我把舊的改了一下差值算法 現(xiàn)在的這個(gè)就是新的 這樣傳入的num就是要滑動(dòng)的長(zhǎng)度
然后我又優(yōu)化了下差值 不會(huì)那么就是有回彈效果 他嫡,然后最后幾個(gè)移動(dòng)距離如果短的話時(shí)間也會(huì)跟著一起縮短 現(xiàn)在看得自然了點(diǎn)


GIF.gif

然后是又添加上如果動(dòng)態(tài)改變數(shù)量的話 每次移動(dòng)速率不會(huì)變

using System;
/**
*Copyright(C) 2019 by #COMPANY#
*All rights reserved.
*FileName:     #SCRIPTFULLNAME#
*Author:       #AUTHOR#
*Version:      #VERSION#
*UnityVersion:#UNITYVERSION#
*Date:         #DATE#
*Description:   
*History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public enum ESVMoveType
{
    Horizontal = 0,
    Vertical
}

public class SVMove
{
    /// <summary>
    /// the firstStart do not Use
    /// </summary>
    public Action correctionHeadCallBack;
    public Action correctionTailCallBack;
    public float duration = 1f;
    Vector2 disNormalizedVe2;
    ScrollRect sv;
    GridLayoutGroup grid;
    bool isTail;
    float scorwPercentage;
    int childcount;

    ESVMoveType svType;
    /// <summary>
    /// Set the SV with Btn and Org 
    /// </summary>
    /// <param name="sv">ScrowView</param>
    /// <param name="btn">ControBtn</param>
    /// <param name="org">Orientation</param>
    public SVMove(Transform sv, int scrowNum = 1, ESVMoveType type = ESVMoveType.Vertical)
    {
        this.sv = sv.GetComponent<ScrollRect>();
        grid = this.sv.content.GetComponent<GridLayoutGroup>();
        svType = type;
        childcount = grid.transform.childCount;
        scorwPercentage = (float)scrowNum / childcount;
        GetDistance(childcount);
    }

    /// <summary>
    /// Move Active Response
    /// </summary>
    public void Move()
    {
        float svNormalizedLong = GetSVNormalizedLong();

        if (svNormalizedLong <= 0)
            isTail = false;
        if (svNormalizedLong >= 1)
            isTail = true;

        if (isTail)
            DoForwardMove();
        else
            DoBackwordMove();
    }

    /// <summary>
    /// Forward move
    /// </summary>
    public void DoForwardMove()
    {
        ChangeDisWithChildcount();
        Vector2 willPos = sv.normalizedPosition - disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);
        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);

        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
            {
                //Correction the tail with End
                if (GetSVNormalizedLong() <= 0.01)
                {
                    if (correctionTailCallBack != null)
                        correctionTailCallBack();

                    isTail = false;
                }
            });
    }

    /// <summary>
    /// Backword Move
    /// </summary>
    public void DoBackwordMove()
    {
        ChangeDisWithChildcount();
        Vector2 willPos = sv.normalizedPosition + disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);
        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);

        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
            {
                //Correction the head  with Start
                if (GetSVNormalizedLong() >= 0.99f)
                {
                    if (correctionHeadCallBack != null)
                        correctionHeadCallBack();

                    isTail = true;
                }
            });
    }
    /// <summary>
    /// if childcount change the moveDistance will be reCalculation
    /// </summary>
    void ChangeDisWithChildcount()
    {
        if (childcount != grid.transform.childCount)
        {
            childcount = grid.transform.childCount;
            GetDistance(childcount);
        }
    }
    /// <summary>
    /// Get the Distance with ScrowNum and Orientation
    /// </summary>
    /// <param name="scrowNum"></param>
    /// <param name="org"></param>
    void GetDistance(int childcount)
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                float childWidth = grid.cellSize.x;
                float maxContentWidth = (childWidth + grid.spacing.x) * childcount - grid.padding.top - sv.GetComponent<RectTransform>().rect.width;
                float disWidth = (childWidth + grid.spacing.x) * scorwPercentage * childcount / maxContentWidth;
                disNormalizedVe2 = disWidth * Vector2.right;
                break;
            case ESVMoveType.Vertical:
                float childHeight = grid.cellSize.y;
                float maxContentHeight = (childHeight + grid.spacing.y) * childcount - grid.padding.left - sv.GetComponent<RectTransform>().rect.height;
                float disHeight = (childHeight + grid.spacing.y) * scorwPercentage * childcount / maxContentHeight;
                disNormalizedVe2 = disHeight * Vector2.up;
                break;
        }
    }
    /// <summary>
    /// chang the Orientation if you want  Backword start 
    /// </summary>
    public void ChangeOrientation()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                disNormalizedVe2.x *= -1;
                break;
            case ESVMoveType.Vertical:
                disNormalizedVe2.y *= -1;
                break;
        }
    }
    /// <summary>
    /// get the SVNormalizedLong with the type
    /// </summary>
    /// <param name="norLong"></param>
    float GetSVNormalizedLong()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return sv.normalizedPosition.x;

            case ESVMoveType.Vertical:
                return sv.normalizedPosition.y;
        }
        return 0;
    }

    //get WillPos limit with movie
    Vector2 MovieRangeLimit(Vector2 willPos)
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                if (willPos.x > 1)
                    willPos.x = 1;
                else if (willPos.x < 0)
                    willPos.x = 0;
                break;
            case ESVMoveType.Vertical:
                if (willPos.y > 1)
                    willPos.y = 1;
                else if (willPos.y < 0)
                    willPos.y = 0;
                break;
        }
        return willPos;
    }

    //limitd the Duaration with WillPos and CorrectPos,it can let movie become more smooth
    float GetDuarationLimitWithDis(Vector2 willPos, Vector2 correctPos)
    {
        if (willPos == correctPos)
            return duration;

        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return (willPos.x - correctPos.x) / (willPos.x < 0 ? willPos.x - 1 : willPos.x) * duration;
            case ESVMoveType.Vertical:
                return (willPos.y - correctPos.y) / (willPos.y < 0 ? willPos.y - 1 : willPos.y) * duration;
        }
        return duration;
    }
}

然后是添加了動(dòng)態(tài)刪除添加移動(dòng)速率不變


using System;
/**
*Copyright(C) 2019 by #COMPANY#
*All rights reserved.
*FileName:     #SCRIPTFULLNAME#
*Author:       #AUTHOR#
*Version:      #VERSION#
*UnityVersion:#UNITYVERSION#
*Date:         #DATE#
*Description:   
*History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public enum ESVMoveType
{
    Horizontal = 0,
    Vertical
}

public class SVMove
{
    /// <summary>
    /// the firstStart do not Use
    /// </summary>
    public Action correctionHeadCallBack;
    public Action correctionTailCallBack;
    public float duration = 1f;
    Vector2 disNormalizedVe2;
    ScrollRect sv;
    GridLayoutGroup grid;
    bool isTail;
    float scorwPercentage;
    int childcount;

    ESVMoveType svType;
    /// <summary>
    /// Set the SV with Btn and Org 
    /// </summary>
    /// <param name="sv">ScrowView</param>
    /// <param name="btn">ControBtn</param>
    /// <param name="org">Orientation</param>
    public SVMove(Transform sv, int scrowNum = 1, ESVMoveType type = ESVMoveType.Vertical)
    {
        this.sv = sv.GetComponent<ScrollRect>();
        grid = this.sv.content.GetComponent<GridLayoutGroup>();
        svType = type;
        childcount = grid.transform.childCount;
        scorwPercentage = (float)scrowNum / childcount;
        GetDistance(childcount);
    }

    /// <summary>
    /// Move Active Response
    /// </summary>
    public void Move()
    {
        float svNormalizedLong = GetSVNormalizedLong();

        if (svNormalizedLong <= 0)
            isTail = false;
        if (svNormalizedLong >= 1)
            isTail = true;

        if (isTail)
            DoForwardMove();
        else
            DoBackwordMove();
    }

    /// <summary>
    /// Forward move
    /// </summary>
    public void DoForwardMove()
    {
        ChangeDisWithChildcount();
        Vector2 willPos = sv.normalizedPosition - disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);
        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);

        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
            {
                //Correction the tail with End
                if (GetSVNormalizedLong() <= 0.01)
                {
                    if (correctionTailCallBack != null)
                        correctionTailCallBack();

                    isTail = false;
                }
            });
    }

    /// <summary>
    /// Backword Move
    /// </summary>
    public void DoBackwordMove()
    {
        ChangeDisWithChildcount();
        Vector2 willPos = sv.normalizedPosition + disNormalizedVe2;
        Vector2 correctPos = MovieRangeLimit(willPos);
        float correctDur = GetDuarationLimitWithDis(willPos, correctPos);

        DOTween.To(() => sv.normalizedPosition, x => sv.normalizedPosition = x,
            correctPos, correctDur).OnComplete(() =>
            {
                //Correction the head  with Start
                if (GetSVNormalizedLong() >= 0.99f)
                {
                    if (correctionHeadCallBack != null)
                        correctionHeadCallBack();

                    isTail = true;
                }
            });
    }
    /// <summary>
    /// if childcount change the moveDistance will be reCalculation
    /// </summary>
    void ChangeDisWithChildcount()
    {
        if (childcount != grid.transform.childCount)
        {
            childcount = grid.transform.childCount;
            GetDistance(childcount);
        }
    }
    /// <summary>
    /// Get the Distance with ScrowNum and Orientation
    /// </summary>
    /// <param name="scrowNum"></param>
    /// <param name="org"></param>
    void GetDistance(int childcount)
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                float childWidth = grid.cellSize.x;
                float maxContentWidth = (childWidth + grid.spacing.x) * childcount - grid.padding.top - sv.GetComponent<RectTransform>().rect.width;
                float disWidth = (childWidth + grid.spacing.x) * scorwPercentage * childcount / maxContentWidth;
                disNormalizedVe2 = disWidth * Vector2.right;
                break;
            case ESVMoveType.Vertical:
                float childHeight = grid.cellSize.y;
                float maxContentHeight = (childHeight + grid.spacing.y) * childcount - grid.padding.left - sv.GetComponent<RectTransform>().rect.height;
                float disHeight = (childHeight + grid.spacing.y) * scorwPercentage * childcount / maxContentHeight;
                disNormalizedVe2 = disHeight * Vector2.up;
                break;
        }
    }
    /// <summary>
    /// chang the Orientation if you want  Backword start 
    /// </summary>
    public void ChangeOrientation()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                disNormalizedVe2.x *= -1;
                break;
            case ESVMoveType.Vertical:
                disNormalizedVe2.y *= -1;
                break;
        }
    }
    /// <summary>
    /// get the SVNormalizedLong with the type
    /// </summary>
    /// <param name="norLong"></param>
    float GetSVNormalizedLong()
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return sv.normalizedPosition.x;

            case ESVMoveType.Vertical:
                return sv.normalizedPosition.y;
        }
        return 0;
    }

    //get WillPos limit with movie
    Vector2 MovieRangeLimit(Vector2 willPos)
    {
        switch (svType)
        {
            case ESVMoveType.Horizontal:
                if (willPos.x > 1)
                    willPos.x = 1;
                else if (willPos.x < 0)
                    willPos.x = 0;
                break;
            case ESVMoveType.Vertical:
                if (willPos.y > 1)
                    willPos.y = 1;
                else if (willPos.y < 0)
                    willPos.y = 0;
                break;
        }
        return willPos;
    }

    //limitd the Duaration with WillPos and CorrectPos,it can let movie become more smooth
    float GetDuarationLimitWithDis(Vector2 willPos, Vector2 correctPos)
    {
        if (willPos == correctPos)
            return duration;

        switch (svType)
        {
            case ESVMoveType.Horizontal:
                return (willPos.x - correctPos.x) / (willPos.x < 0 ? willPos.x - 1 : willPos.x) * duration;
            case ESVMoveType.Vertical:
                return (willPos.y - correctPos.y) / (willPos.y < 0 ? willPos.y - 1 : willPos.y) * duration;
        }
        return duration;
    }
}

然后是源碼Demo地址
https://github.com/1004019267/ScorwViewMoveAndDragUI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葫笼,一起剝皮案震驚了整個(gè)濱河市卢肃,隨后出現(xiàn)的幾起案子铭污,更是在濱河造成了極大的恐慌,老刑警劉巖捏卓,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔬浙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顶滩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)寸爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)礁鲁,“玉大人,你說(shuō)我怎么就攤上這事赁豆〗龃迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵魔种,是天一觀的道長(zhǎng)析二。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么叶摄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任属韧,我火速辦了婚禮,結(jié)果婚禮上蛤吓,老公的妹妹穿的比我還像新娘宵喂。我一直安慰自己,他們只是感情好会傲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锅棕。 她就那樣靜靜地躺著,像睡著了一般淌山。 火紅的嫁衣襯著肌膚如雪裸燎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天泼疑,我揣著相機(jī)與錄音德绿,去河邊找鬼。 笑死退渗,一個(gè)胖子當(dāng)著我的面吹牛脆炎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氓辣,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袱蚓!你這毒婦竟也來(lái)了钞啸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喇潘,失蹤者是張志新(化名)和其女友劉穎体斩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颖低,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡絮吵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忱屑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬敲。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莺戒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪校,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站麻惶,受9級(jí)特大地震影響用踩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碎乃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佛南。 院中可真熱鬧嗅回,春花似錦绵载、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躯畴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摹察,已是汗流浹背倡鲸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逼争,地道東北人誓焦。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓杂伟,卻偏偏與公主長(zhǎng)得像赫粥,于是被迫代替她去往敵國(guó)和親予借。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)瀑粥。 注意:講述HT...
    kismetajun閱讀 27,489評(píng)論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 第3章 基本概念 3.1 語(yǔ)法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類(lèi)型 5種簡(jiǎn)單數(shù)據(jù)類(lèi)型:Unde...
    RickCole閱讀 5,128評(píng)論 0 21
  • 做自己喜歡的事會(huì)被專(zhuān)重嗎[割按?] 在開(kāi)學(xué)後的第一堂公民課,班主任叫每個(gè)同學(xué)介紹自己一遍磷籍,除姓名以外,還要説自己喜歡做...
    咕嚕咕嚕喝酒了閱讀 223評(píng)論 0 2
  • 在古老的山村里院领,流傳著一個(gè)關(guān)于月下石緣的民間故事弛矛。這個(gè)故事充滿(mǎn)了神奇與浪漫比然,被一代又一代人傳頌至今丈氓。 故事發(fā)生在很...
    Abc159357閱讀 229評(píng)論 0 5