玩轉(zhuǎn)中繼器 | 九宮格拼圖的實(shí)現(xiàn)原理

11 評(píng)論 36415 瀏覽 70 收藏 7 分鐘

今天帶給大家的案例是使用 Axure 7.0(當(dāng)然 8.0 也是可以的)制作一個(gè)九宮格拼圖原型。不過(guò)本文只講述實(shí)現(xiàn)原理,不講述具體實(shí)現(xiàn)步驟,希望小伙伴們能了解思路并自己動(dòng)手去實(shí)踐,因?yàn)樗伎嫉倪^(guò)程才是最好的學(xué)習(xí)過(guò)程。

這個(gè)案例已經(jīng)構(gòu)思了很長(zhǎng)時(shí)間,中間因?yàn)闆](méi)有思路便放下了一段時(shí)間,前幾天有朋友問(wèn)我能否制作一個(gè)九宮格拼圖的原型,于是又重新思考起來(lái)。這個(gè)原型最燒腦的地方就是圖片移動(dòng)邏輯的實(shí)現(xiàn),因?yàn)橹挥锌瘴恢苓叺膱D片才可以將其移動(dòng)到空位上。另外,這個(gè)原型有一個(gè)無(wú)解的BUG,為了實(shí)現(xiàn)圖片的隨機(jī)排列,導(dǎo)致了有時(shí)候生成的隨機(jī)圖片無(wú)法復(fù)原,也就是無(wú)論如何都拼不好,不過(guò)這種情況是隨機(jī)出現(xiàn)的,有時(shí)候也是可以拼好的。

話說(shuō)何為九宮格拼圖?不說(shuō)你已經(jīng)懂了!

0

預(yù)覽地址:http://raedme.cn/axurelab/010_jiugongpintu/

實(shí)現(xiàn)原理

好了,接下來(lái)就為大家解析一下這個(gè)拼圖原型的實(shí)現(xiàn)原理(后文較為枯燥,閱讀請(qǐng)謹(jǐn)慎)。

首先,是點(diǎn)擊圖片可以將圖片移動(dòng)到臨近空白區(qū)域的原理。下面我借助一個(gè)模型來(lái)講。

模型

這是一個(gè)九宮格,在本案例中,九宮格我使用中繼器來(lái)實(shí)現(xiàn)。九宮格中 A、B、C、D、E、F、G、H 分別代表八張圖片,0 代表空白區(qū)域。此時(shí),可以將圖片 H 或者圖片 F 移動(dòng)到 0 位置,對(duì)應(yīng)的 H 或 F 位置變成空白區(qū)域 0。之后再點(diǎn)擊和 0 相鄰的圖片,遵循相同的移動(dòng)原理。

那么問(wèn)題來(lái)了,如何判斷我點(diǎn)擊的圖片相鄰位置有一個(gè)空白區(qū)域,可以將該圖片移動(dòng)到空白區(qū)域?此問(wèn)題是該案例的核心問(wèn)題,那么我接著用一個(gè)模型來(lái)給大家講解。

模型1

在這個(gè)圖中,我為九宮格中的每個(gè)區(qū)域加一個(gè)坐標(biāo),用(x,y)來(lái)表示,這一步是實(shí)現(xiàn)該原型的關(guān)鍵步驟。然后我們來(lái)分析一下每個(gè)區(qū)域之間坐標(biāo)的關(guān)系。

比如 F 區(qū)和 0 區(qū)之間的關(guān)系,H 區(qū)和 0 區(qū)之間的關(guān)系,其實(shí)就是空白區(qū)域和它相鄰四周的區(qū)域的坐標(biāo)關(guān)系。我們可以任意假設(shè)一個(gè)區(qū)域?yàn)榭瞻讌^(qū)域,然后分析它上側(cè)、下側(cè)、左側(cè)、右側(cè)區(qū)域的(x,y)坐標(biāo)。經(jīng)過(guò)分析之后,我們可以得出一個(gè)結(jié)論。

可以用一個(gè)表達(dá)式來(lái)表達(dá):

|0.x-相鄰區(qū)域.x|+|0.y-相鄰區(qū)域.y|=1

翻譯一下就是:0 區(qū)域的 x 值減去相鄰區(qū)域的 x 值的絕對(duì)值加上 0 區(qū)域的 y 值減去相鄰區(qū)域的 y 值的絕對(duì)值等于 1。反過(guò)來(lái)推也成立,就是如果兩個(gè)區(qū)域的(x,y)坐標(biāo)分別求差的絕對(duì)值然后再相加等于 1 的話,那么這兩個(gè)區(qū)域一定是相鄰的區(qū)域。

通過(guò)以上邏輯,我們可以判斷相鄰區(qū)域(上下相鄰 or 左右相鄰),這非常重要。然后我們?cè)倥袛嘁幌孪噜弲^(qū)域的其中一個(gè)是否為空白區(qū)域,如果是空白區(qū)域,那么點(diǎn)擊另一個(gè)區(qū)域的時(shí)候,就可以將其移動(dòng)到相鄰的空白區(qū)域;如果不是空白區(qū)域,那么點(diǎn)擊無(wú)效。

舉例說(shuō)明:

模型1

當(dāng)我點(diǎn)擊 H 區(qū)域的時(shí)候,首先要尋找它的相鄰區(qū)域,通過(guò)前面介紹的表達(dá)式(|0.x-相鄰區(qū)域.x|+|0.y-相鄰區(qū)域.y|=1)我們可以得到 H 區(qū)域的相鄰區(qū)域?yàn)?E、G、0(不要說(shuō)你一看就知道,你一看就知道,但是中繼器在運(yùn)行的時(shí)候是不知道的,只能通過(guò)邏輯判斷來(lái)獲得)。

然后再判斷這些相鄰區(qū)域中是否有一個(gè)區(qū)域是空白區(qū)域,這個(gè)我們可以通過(guò)給中繼器的數(shù)據(jù)集中加上一個(gè)標(biāo)記字段來(lái)標(biāo)記空白區(qū)域,這一步的實(shí)現(xiàn)較為簡(jiǎn)單。

這個(gè)例子中可以得知空白區(qū)域是 0 ,因此可以將 H 移動(dòng)到 0 區(qū)域。

如果點(diǎn)擊的區(qū)域是 E,那么其相鄰的 4 個(gè)區(qū)域中就找不到空白區(qū)域,因此點(diǎn)擊區(qū)域 E 就不會(huì)發(fā)生移動(dòng)。

好了,基于以上邏輯,就可以實(shí)現(xiàn)九宮格拼圖的核心功能了——點(diǎn)擊圖片移動(dòng)到相鄰的空白的區(qū)域,如果相鄰沒(méi)有空白區(qū)域,就不移動(dòng)。

但是接下來(lái)還有另外一件事情就是,如何使拼圖圖片可以隨機(jī)排列,并且每次原型載入時(shí)排列的順序都不一樣。

這 一效果的實(shí)現(xiàn)我在以前的案例中都有講過(guò),可以通過(guò)給中繼器的數(shù)據(jù)集增加一個(gè)排序字段,然后給排序字段賦值為隨機(jī)數(shù),之后為中繼器增加排序。因?yàn)槊看沃欣^器 數(shù)據(jù)集中的每行數(shù)據(jù)的排序字段的值都不一樣,所以每次排序的結(jié)果會(huì)不一樣。但是在本案例中需要考慮到要把空白區(qū)域始終排在最末尾,因此該數(shù)據(jù)項(xiàng)的排序字段 需要做一個(gè)特殊的處理。

到這里九宮格拼圖的主要實(shí)現(xiàn)邏輯就講完了,不知道小伙伴們能否看得懂。具體的實(shí)現(xiàn)步驟,小伙伴們勇敢的去探索吧。

 

作者:大鵬,微信:urmagic,可一起交流原型設(shè)計(jì)問(wèn)題,歡迎騷擾。

本文由 @大鵬 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 求教樓主:我使用中繼器的“設(shè)置當(dāng)前頁(yè)”功能時(shí),點(diǎn)擊按鈕設(shè)置成到中繼器的“下一個(gè)”or“上一個(gè)”,前臺(tái)頁(yè)面顯示都不生效不跳轉(zhuǎn)。但是設(shè)置成到中繼器的“l(fā)ast”或者賦值value到某一頁(yè),前臺(tái)點(diǎn)擊效果是生效(成功跳轉(zhuǎn))的。是因?yàn)槭裁茨??我用的Axure8.0(3312版),漢化了。

    來(lái)自北京 回復(fù)
  2. 嘗試了一番,只能做到初始化圖片亂序,點(diǎn)擊移動(dòng)還是搞不懂中繼器怎么做,原理能理解,但是不知道如何把距離判斷和中繼器結(jié)合起來(lái),如果可以的話希望能給原型研究研究,Thx~

    來(lái)自上海 回復(fù)
  3. 厲害,我要學(xué)習(xí)你的鉆研精神了

    來(lái)自江西 回復(fù)
  4. 我想問(wèn)問(wèn)如何標(biāo)記區(qū)域坐標(biāo),隨機(jī)排序后,如何才能將坐標(biāo)與中繼器item掛上鉤?想了好久不知道如何解決。。求幫助

    來(lái)自北京 回復(fù)
  5. 這個(gè)其實(shí)不用這么麻煩
    abc
    def
    ghi

    a=1 b=2 c=3 d=4 e=5 。。??諡?,a到i對(duì)應(yīng)1~8,以及0

    檢測(cè)周邊變量值:如果有0,則移動(dòng)
    如果有0,將有0的變量和點(diǎn)擊的變量進(jìn)行值互換,同時(shí)移動(dòng)對(duì)應(yīng)值的圖片

    比如點(diǎn)擊熱區(qū)a,那么檢測(cè)bde,發(fā)現(xiàn)b是0,這時(shí)讓a=0,b=1(a原來(lái)的值),同時(shí)移動(dòng)1號(hào)圖片到b的位置
    (熱區(qū)放上面,圖片放下面)

    來(lái)自北京 回復(fù)
  6. 為什么總有噴子?

    回復(fù)
  7. 中繼器還不太會(huì)用,先收藏。

    來(lái)自北京 回復(fù)
  8. 原型不是讓你去代替技術(shù)的 你有這些時(shí)間 可以多去優(yōu)化下你的產(chǎn)品邏輯

    來(lái)自山東 回復(fù)
    1. 這位仁兄何出此言?開(kāi)始幫我支配我的時(shí)間了?研究Axure是我的興趣,優(yōu)化產(chǎn)品邏輯是我工作本職,兩者并不沖突

      來(lái)自天津 回復(fù)
    2. 每一個(gè)人的思想層面不同,著力點(diǎn)也不同,就像有人喜歡一門(mén)心思做產(chǎn)品,研究原型,而有些人只是快速成型,迅速拿到資金投入開(kāi)發(fā)一樣。有的人務(wù)實(shí),有的人務(wù)虛。真真假假,假假真真。

      如果我是老板,你們兩個(gè)我都要,一個(gè)去給我賺錢(qián),一個(gè)去把賺來(lái)的錢(qián),用于產(chǎn)品的質(zhì)量升級(jí)。

      來(lái)自北京 回復(fù)
  9. 邏輯看明白啦,但是還是不知道該怎么做,以我現(xiàn)在的水平是做不出來(lái)啦,繼續(xù)學(xué)習(xí)吧

    來(lái)自廣東 回復(fù)