寫這例子的初衷是想模仿通訊錄列表,實現了一些效果,也沒法做到100%相像,自己也認為還有一些不足(存在些內存上的浪費)。
這個階段先這樣了,代碼量比較大,就不貼代碼了,只上效果圖。
源碼下載地址:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2012年資料/1月/26日/Android開發教程:仿通訊錄ListView小例子/
效果圖如下:
1.實現根據字母進行分類。
2.實現快速滑動及修改快速滑動條的圖標。
3.實現快速滑動時的字母提示。
4.實現快捷操作框及其的動畫顯示/隱藏,上箭頭與下箭頭的選擇性顯示及位置匹配。
5.順便做了個自定義Dialog和完整的發送郵件的實現(主送、抄送、密送、附件、標題、正文)。
部分實現細節介紹:
1.快速滑動時的字母提示框
該顯示組件為TextView,實例索引名為txtOverlay,執行WindowManager.addView(txtOverlay, layoutParams)後添加於WindowManager上。通過設置ListView.OnScrollListener監聽到滾動時則將txtOverlay設置可見性為View.VISIBLE,當滾動結束時可見性調為View.INVISIBLE。
為了提升用戶體驗,避免在短時間內,用戶再次拖動時字母提示框又執行顯示和隱藏命令,將隱藏的操作設置在DisapearThread線程實例中,通過handler.postDelayed(disapearThread, 1500)延時1.5秒後再執行字母提示框的隱藏。
2.快速滾動圖標的修改
Android Api並未公開修改圖標的接口,本處通過調用Java的反射機制修改了快速滾動的圖標。替換代碼見MainAct類中的changeFastScrollerDrawable()。
補充:Android對ListView設置了優化,對於少於4頁內容的List即使設置了fastScrollEnabled=true也不會顯示FastScroller。
參考資料查看:<Android_Source>/frameworks/base/core/java/android/widget/FastScroller.java:其中常量MIN_PAGES及其相關。
3.獲取List中“咧牙”ImageView在屏幕中的絕對位置
代碼如下:anchor為“咧牙”ImageView。
[java]
- int[] location = new int[2];
- anchor.getLocationOnScreen(location);
- Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(),
- location[1] + anchor.getHeight());
這個步驟也是為上箭頭與下箭頭的自動選擇做好鋪墊。
4.為快捷按鈕組成的LinearLayout設置反彈動畫
設置LinearLayout沿直線軌跡從從屏幕右邊滑動到左邊這個部分的動畫定義文件是res/anim/anim_actionslayout.xml,代碼如下:
[xhtml]
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 本文件指定了actionsLayout的出現動畫。 -->
- <!-- translate定義了垂直或水平方向或兩者混合的一種運動。 -->
- <!-- formXDelta:賦值為浮點數或百分比。百分號後面'p'表示相對於父控件的相應位置。當只有百分號時表示相對於控件本身的位置。 -->
- <!-- 查看@android:integer/config_longAnimTime的具體值可於<SDK_PATH>/platforms/<android-level>/data/res/values/config.xml -->
- <translate xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromXDelta="100%p"
- android:toXDelta="0"
- android:duration="@android:integer/config_longAnimTime"
- ></translate>
需要反彈的效果還得對Animation設定Interpolator(插值器),插值器的設定需要一些數學基礎了,得找到合適的函數對動畫速率進行修正。本例中使用的插值器代碼如下:
[xhtml]
- package lab.sodino.list_quickaction;
- import android.util.Log;
- import android.view.animation.Interpolator;
- /**
- * @author Sodino E-mail:[email protected]
- * @version Time:2011-5-3 下午08:02:01
- */
- public class CustomInterpolator implements Interpolator {
- /**
- * @param input
- * A value between 0 and 1.0 indicating our current point in the
- * animation where 0 represents the start and 1.0 represents the
- * end
- * @return Returns The interpolation value. This value can be more than 1.0
- * for Interpolators which overshoot their targets, or less than 0
- * for Interpolators that undershoot their targets.
- */
- public float getInterpolation(float input) {
- Log.d("ANDROID_LAB", "input=" + input);
- // 設定動畫的加速度變化值。此例的效果是使用actionsLayout超過目標旋轉區後再反彈回來。
- // 插值計算公式: 1.2-((x*1.55f)-1.1)^2
- // 畫出函數圖的話即可觀察出動畫執行過程中越過目標區再反彈的詳細過程。
- // x :0 <= v <= 1.0
- // (x*1.55f) :0 <= v <= 1.55
- // ((x*1.55f)-1.1) :-1.1 <= v <= 0.45
- // ((x*1.55f)-1.1)^2 :0<= v <= 1.21
- // 1.2-((x*1.55f)-1.1)^2 :-0.1 <= v <= 1.2
- final float inner = (input * 1.55f) - 1.1f;
- // 如果返回值為常量1的話,則相當於沒有動畫效果。
- return 1.2f - inner * inner;
- }
- }