Ionic源碼解析之一手動打開list的Slide Item方法

在詳細敘述解決問題的方法之前,讓我們看下slide item在list中的位置?它和list、item以及item options的關系?


結構

slide item首先存在于一個列表中,所以它的父親是一個ion-list。

ion-list包含ion-item-sliding。

ion-item-sliding又包含ion-item(用于顯示列表內容)和ion-item-options(用于顯示滑動處理的選項)

我們這邊講的slide item是指ion-item-sliding。

具體的html的用法可以參考官方文檔。

下面通過怎么解決“手動打開Slide Item”的問題來對Ionic2的slide item的源碼學習。

怎么手動打開Slide Item

目前左滑可以打開slide item,那么如果通過點擊一個button,是否也可以打開slide item呢?

查看了slide item的文檔,看到只有slidingItem.close()接口,并沒有open接口。

那么看來Ionic2只提供手動關閉slide item的API,沒有手動打開slide item的API。


為什么會這樣呢?我想只有編寫者才知道了。。。

之前沒有習慣看框架的源碼,其實大部分是框架封裝的不錯,似乎不需要看源代碼,那么就可以拿到想要的;而有的源碼看的一頭霧水,能力不及所致。


但是當你在網上搜索太多根本無果,那么也只能硬著頭皮看看源碼吧,看了發(fā)現并沒有那么難,也許自己也沒有那么菜,嘿嘿,夸獎一下自己。

最重要的是不僅可以找到直接的解決方法,也可以從別人的代碼中學習編碼的方式,受益多多。

下面總結了三種解決的方法:

1. 在源代碼中增加一個open的接口

下面是源碼中的close接口

close(){

this._setOpenAmount(0,true);

}

增加一個open接口

open(){

this._setOpenAmount(1,true);

}

好處是簡單。缺點是直接修改框架源代碼肯定不是一個好的解決方法,而且對于這種更新比較快的框架來說,以后的升級和維護中會比較麻煩。

那就看看第二種方法。

2. 直接用css暴力打開

采用css的方式給ion-item以及slide item加入相應的樣式去打開。

下面是相應的代碼。

其中item就是結構中所說的ion-item, slideItem就是結構中所說的ion-item-sliding。

let coord = pointerCoord(event); //獲取點擊的起點位置

slideItem.startSliding(coord.x);

let openAmount = this.slideItem._rightOptions.width();

item.setElementStyle("transition", '');

slideItem.setElementClass('active-sliding', true);

slideItem.setElementClass('active-slide', true);

slideItem.setElementClass('active-options-right', true);

item.setElementStyle("transform",

`translate3d(${-openAmount}px,0,0)`);

此方法可以打開,可以實現相應的功能。但是帶來的問題是,有一些手機,特別是小米的某些手機,無法正常關閉slide item,是瀏覽器不兼容的問題,所以如果使用這樣的方式,我們需要把超級大麻煩“瀏覽器兼容”的問題引進來。

其實Ionic2框架很重要的一點是幫你做了相關的瀏覽器兼容性的處理。

那么我們?yōu)槭裁从忠匦伦鲆槐槟兀?/p>

所以就想到了第三種方法,深入看源碼,是否可以模擬手指滑動的過程呢?

模擬手指滑動的過程

通過進一步查看ion-slide-item的源碼,發(fā)現有一些public的方法:

startSliding

moveSliding

endSliding

這些接口被item-sliding-gesture.js調用,原來slide item還有一個gesture用來管理它。

那么下面就是通過測試的模擬過程:

letcoord=pointerCoord(event),

firstCoordX=coord.x,

firstTimestamp=Date.now(),

step=50,

moveCoordX1=firstCoordX-step,

moveCoordX2=moveCoordX1-step,

endCoordX=moveCoordX2-step,

deltaX=endCoordX-firstCoordX,

deltaT=1;

this.slideItem.startSliding(firstCoordX);

this.slideItem.moveSliding(moveCoordX1);

this.slideItem.moveSliding(moveCoordX2);

deltaT=(Date.now()-firstTimestamp);

this.slideItem.endSliding(deltaX/deltaT);

代碼的詳細解釋主要是確認手指開始、移動、結束的點擊位置,當然還有一些其他的參數,這里重點說一下時間這個參數,其他的參數可以參考源碼。


為什么需要計算時間?

這里我們采用快速滑動的理論來直接打開slide item。

時間滑動思想

如果是慢一點的滑動時,滑動多大的寬度slide-item-option就出來多大的寬度,如果超過一半停止滑動會直接打開slide item,如果沒有超過一半就停止滑動那么slide item會關閉;

這個大家可以通過滑動list來做實驗。

因為我們是模擬,所以會根據這個思想會構造相應的參數,否則沒辦法成功的哦。

這也是為什么moveSliding并不需要隔幾秒執(zhí)行,我們是模擬的快速滑動。

為什么是一個start動作、兩次move動作,一次end動作

看了源碼就發(fā)現必須是一個start動作,至少兩次的move動作,一次end動作

起始肯定是需要的,但是move的動作至少是兩個,看了源碼會知道中間會計算一些值,有些事在第一次move的時候計算的,有些是第二次move的時候計算的,而這些值在end的時候會進行計算。

更多細節(jié)部分參見它官方的源碼。

源碼下載https://github.com/ionic-team/ionic。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • echo 3 > /sys/class/backlight/acpi_video0/brightness 需要在r...
    柳枝閱讀 2,072評論 0 0
  • 俗話說“遠親不如近鄰”,對于這句話,我有些不以為然,再遠的親戚畢竟也親戚,再近的鄰居也只是一個陌生人,總是...
    峽溪飛瀑閱讀 221評論 0 0
  • 09.27晚 微信群內 邀請了才智創(chuàng)信創(chuàng)始人周翔老師,進行“互聯網思維”為主題的分享,現在對之前的分享做一個小結。...
    產品新人學習路閱讀 323評論 0 0
  • 【0509晨讀感想】 實現夢想人生的魔法 剛好是在上班路上聽的今天晨讀,聽到《聰明女人背小包》這個題目的時候,我瞅...
    小二關閱讀 177評論 0 0

友情鏈接更多精彩內容