單詞卡功能實現

仿探探左右滑動卡片的效果很多

http://ju.outofmemory.cn/entry/328946

這裏,我是用的

https://github.com/xiepeijie/SwipeCardView

我的單詞卡片功能,都是在這個項目上進行的修改

單詞卡功能Demo地址

本Demo通過精確計算單詞的位置,在onTouch中處理了點擊事件,所以,“點擊單詞”觸發跳轉單詞詳情頁和“按住單詞滑動卡片”,這兩者,不衝突。但是請注意,精確計算單詞位置,和使用的佈局是有關係的。有的佈局就不能精確計算,只能給單詞單獨添加點擊事件,這樣,會出現,按住單詞滑動,卡片不滑動的情況

爲了更好的理解和使用,請詳細讀一下 下面的“使用相關說明”、“單詞定位計算說明”

先上一些效果圖:
1、APP首頁
在這裏插入圖片描述
2、常規(滿數據)“一卡多詞”模式
在這裏插入圖片描述
3、數據不足“一卡五詞”的情況
在這裏插入圖片描述
4、“一卡一詞”,釋義較短(沒有超過一行)的情況
在這裏插入圖片描述
5、“一卡一詞”釋義較長,超過一行的情況
在這裏插入圖片描述
上圖中,紅黑線段說明:
1、一卡多詞模式,用於標明,單詞展示區域,即:點擊橫、豎線約束的區域,可以實現跳轉到單詞詳情頁
2、一卡一次模式,橫線標明這段橫向區域內可以觸發點擊事件,而豎線,是對橫向區域的再次約束。
橫向紅線和豎向紅線,是單詞的展示區域;橫向紅線和豎向黑線,是釋義的展示區域

特別說明:此Demo有2個明顯缺點
1、不支持卡片撤回。即:卡片劃出去後,不支持將滑出的卡片撤回來
2、“一卡一次”模式下,“釋義”區域的計算,有漏洞,只考慮了“釋義沒有超過一行”的情況。即:釋義多行時,點擊釋義的接近底部的區域,是不會觸發跳轉詳情頁的事件。

這塊,請自行修改。
在 DataUtil 中的 computeOneCardOneWordCoordinates 方法中,計算行數的位置

使用相關說明
1、當卡片有多層時,第一張下面的卡片,是縮小的,當第一張劃出去,第二張隨着滑動而放大到正常大小。如果不想要這個效果,

SwipeFlingAdapterView 下,
註釋掉 adjustChildView、adjustChildrenOfUnderTopView這2個方法

2、如果想後面的卡片,縮小後,在第一張的底部漏出來一些,在佈局中,需要設置

swipe:y_offset_step

如:

    <......SwipeFlingAdapterView
        android:id="@+id/swipe_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        swipe:min_adapter_stack="2"
        swipe:max_visible="2"
        swipe:y_offset_step="28dp"/>

3、卡片滑動靈敏度調整

FlingCardListener中,

 /**
 * 鬆開手指後,卡片滑出屏幕靈敏度調整規則
 * <p>
* 1、左滑,增大leftBorder()方法中,"3.8"的值,可以減小靈敏度,讓用戶滑動更多距離,纔會使得卡片移出屏幕
 * <p>
 * 2、右滑,減小rightBorder()方法中,"2.2"的值,可以減小靈敏度,讓用戶滑動更多距離,纔會使得卡片移出屏幕
 */
public float leftBorder() {
	 return parentWidth / 3.8f;
}

public float rightBorder() {
	 return 2.2f * parentWidth / 3f;
}

4、關於單詞點擊。
如果給單詞直接設置點擊事件(setOnClickListener),那麼,就不需要進行座標計算了。但是引發出一個問題,按住單詞,滑動手指,卡片不會隨之滑動。這是,因爲,單詞的點擊事件,把滑動事件消費掉了。
其實,框架中,在onTouch中,已經判斷處理過了,在一定範圍內,會視爲點擊。
詳見:

FlingCardListener -> onTouch -> resetCardViewOnStack -> mFlingListener.onClick

計算得到的定位數據的使用,在 FlingCardListener -> getWordIndex

最後,點擊事件的回調,會回到卡片界面的onItemClicked
(本Demo中,是 CardActivity -> onItemClicked)

5、卡片界面(Demo中是CardActivity)

removeFirstObjectInAdapter 中,必須,必須,必須要有adapter?.remove(0)
否則,第一張滑出去後,後面的卡片,均無法滑動

單詞定位計算說明:
1、關於狀態欄等的計算,請看
DataUtil 中的 computeCardDataCoordinates

2、我現在的佈局,大體是這樣的:
在這裏插入圖片描述
不建議使用下面的形式佈局,不然,很容易出現定位偏差
在這裏插入圖片描述
出現偏差的後果是,一卡多詞時,單詞區域計算錯誤,點擊第4個單詞的下半部分,會觸發第5個單詞的點擊事件。

還有,如果卡片使用 .9等帶陰影的背景圖,根本不建議使用定位算法了。直接給單詞加個點擊事件吧,雖然會出現 “按住單詞滑動,卡片不滑動”的問題,但是,至少整體功能是對的。且釋義不能加點擊事件,因爲點擊事件會消費滑動事件,點擊的熱區越大,能引起滑動的熱區就越小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章