`

Android]仿通讯录ListView小例子

 
阅读更多

[Android]仿通讯录ListView小例子

本文和上面示例借鉴了:

http://blog.csdn.net/sodino/archive/2010/12/15/6077017.aspx

做的比较简单。需要为ListView注册一个滚动监听器:

listView.setOnScrollListener(new OnScrollListener() {

boolean visible;

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
visible = true;
if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) {
overlay.setVisibility(View.INVISIBLE);
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (visible) {
overlay.setText(items[firstVisibleItem].substring(0, 1));
overlay.setVisibility(View.VISIBLE);
}
}
});

当然,还需要提示信息的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="80dp" android:maxWidth="80dp" android:gravity="center"
android:textSize="70sp" android:textColor="#ffffffff"
android:background="#99000088" android:padding="10dp" android:visibility="invisible"/>

理论上,可以做出很花哨的提示界面。

在Activity的onCreate方法中加入这个界面:

this.overlay = (TextView) View.inflate(this, R.layout.overlay, null);
getWindowManager()
.addView(
overlay,
new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT));

这里要注意:

listView.setOnScrollListener(new OnScrollListener() {

boolean visible;

监听器代码中增加了一个visible标志位。用于判断是否滚动状态变化过。否则,启动Activity后,无论提示界面是否invisible,都会显示,因为会调用onScroll方法。

写这例子的初衷是想模仿通讯录列表,实现了一些效果,也没法做到100%相像,自己也认为还有一些不足(存在些内存上的浪费)。
这个阶段先这样了,代码量比较大,就不贴代码了,只上效果图。
源码下载地址:
http://download.csdn.net/source/3245470

效果图如下:

preview1preview2preview3


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。

  1. int[]location=newint[2];
  2. anchor.getLocationOnScreen(location);
  3. RectanchorRect=newRect(location[0],location[1],location[0]+anchor.getWidth(),
  4. location[1]+anchor.getHeight());

这个步骤也是为上箭头与下箭头的自动选择做好铺垫。

4.为快捷按钮组成的LinearLayout设置反弹动画

设置LinearLayout沿直线轨迹从从屏幕右边滑动到左边这个部分的动画定义文件是res/anim/anim_actionslayout.xml,代码如下:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!--本文件指定了actionsLayout的出现动画。-->
  3. <!--translate定义了垂直或水平方向或两者混合的一种运动。-->
  4. <!--formXDelta:赋值为浮点数或百分比。百分号后面'p'表示相对于父控件的相应位置。当只有百分号时表示相对于控件本身的位置。-->
  5. <!--查看@android:integer/config_longAnimTime的具体值可于<SDK_PATH>/platforms/<android-level>/data/res/values/config.xml-->
  6. <translatexmlns:android="http://schemas.android.com/apk/res/android"
  7. android:fromXDelta="100%p"
  8. android:toXDelta="0"
  9. android:duration="@android:integer/config_longAnimTime"
  10. ></translate>

需要反弹的效果还得对Animation设定Interpolator(插值器),插值器的设定需要一些数学基础了,得找到合适的函数对动画速率进行修正。本例中使用的插值器代码如下:

  1. packagelab.sodino.list_quickaction;
  2. importandroid.util.Log;
  3. importandroid.view.animation.Interpolator;
  4. /**
  5. *@authorSodinoE-mail:sodinoopen@hotmail.com
  6. *@versionTime:2011-5-3下午08:02:01
  7. */
  8. publicclassCustomInterpolatorimplementsInterpolator{
  9. /**
  10. *@paraminput
  11. *Avaluebetween0and1.0indicatingourcurrentpointinthe
  12. *animationwhere0representsthestartand1.0representsthe
  13. *end
  14. *@returnReturnsTheinterpolationvalue.Thisvaluecanbemorethan1.0
  15. *forInterpolatorswhichovershoottheirtargets,orlessthan0
  16. *forInterpolatorsthatundershoottheirtargets.
  17. */
  18. publicfloatgetInterpolation(floatinput){
  19. Log.d("ANDROID_LAB","input="+input);
  20. //设定动画的加速度变化值。此例的效果是使用actionsLayout超过目标旋转区后再反弹回来。
  21. //插值计算公式:1.2-((x*1.55f)-1.1)^2
  22. //画出函数图的话即可观察出动画执行过程中越过目标区再反弹的详细过程。
  23. //x:0<=v<=1.0
  24. //(x*1.55f):0<=v<=1.55
  25. //((x*1.55f)-1.1):-1.1<=v<=0.45
  26. //((x*1.55f)-1.1)^2:0<=v<=1.21
  27. //1.2-((x*1.55f)-1.1)^2:-0.1<=v<=1.2
  28. finalfloatinner=(input*1.55f)-1.1f;
  29. //如果返回值为常量1的话,则相当于没有动画效果。
  30. return1.2f-inner*inner;
  31. }
  32. }

最后声明下,楼主只是汇总了前人的成果然后自己拿来用而已。下面为参考资料:
1.ApiDemo
2.http://marshal.easymorse.com/archives/3929
3.http://www.londatiga.net/it/


分享到:
评论

相关推荐

    Android仿通讯录ListView小例子

    Android仿通讯录ListView小例子 Android仿通讯录ListView小例子 Android仿通讯录ListView小例子

    Android开发教程:仿通讯录ListView小例子

    教程说明见 http://www.linuxidc.com/Linux/2012-01/52373.htm

    Android开发:仿通讯录ListView小例子

    android仿通讯录头文字提示弹窗,listview列表显示。

    通讯录资源

    4、Android]仿通讯录ListView小例子 5、私密通讯录源码contact.zip 6、类QQ界面-ContactsManager 7、界面效果不错.rar 8、使用Jquery Mobile设计Android通讯录.docx 9、手机通讯录产品横评及畅想.docx 10、资源.txt ...

    android标题固定的ListView

    里面有两个项目资源例子,是实现android 标题固定Listview的两种方式,请大家查阅,希望对大家有帮助。

    Android 通讯录 Android contact源代码

    摘要:Java源码,Android源码,通讯录 Android contact通讯录实例,比较不错的例子,来自书中的完整实例,Android手机读取联系人信息、显示、保存、编辑联系人,多卡同时读取联系人等,涉及要点:删除指定数据列、URI...

    Android-app.rar

    Android例子源码仿多看阅读的左右平移翻页效果小例子 Android例子源码可以通过网络请求内容的自定义列表选择Dialog Android例子源码图片旋转缩放加盖水印透明倾斜扭曲处理 Android例子源码实现Windows8风格的Dialog ...

    Android例子源码通讯录联系人字母排序索引A-Z.zip

    主要实现功能: 1、获取手机通讯录内容已列表的形式展示。 2、屏幕右边有26字母的标杆,触摸标杆的任一字母,该字母...4、滑动该listview,当活动结束时,屏幕最上面的联系人的首字母对应的字母标杆颜色、字体改变。

    Android例子源码通讯录联系人字母排序索引A-Z

    主要实现功能: 1、获取手机通讯录内容已列表的形式展示。 2、屏幕右边有26字母的标杆,触摸标杆的任一字母,该...4、滑动该listview,当活动结束时,屏幕最上面的联系人的首字母对应的字母标杆颜色、字体改变。 

    Android40个经典源码

    27 android源码分享之私密通讯录源码 28 Android自定义泡泡效果 源码 29 android 获取Gps信息的程序源码 30 android 超炫的图片浏览器 31 android 加载时闪烁点样式的启动画面 32 基于 Android 的英文电子词典 33 ...

    Android使用SQLite实现联系人APP

    这是Android开发的一个例子,作为学习SQLite的一个样板。使用Android SQLite数据库实现联系人的增删改查功能,同时使用了ListView、Adapter来实现数据的列表显示,使用SearchView与Filter数据过滤器来实现搜索功能。

    Android之实现系统联系人软件的分组和字母表导航效果

    联系人分章节显示、ListView快速滑动显示联系人首字母、附带字母表快速查找的例子, 查阅网络资源,实现方式都是比较复杂,尤其有些还实现了SectionIndex接口,很多人不怎么能理解,研究后发现此种类型的例子没必要...

    ListIndex:显示列表视图的索引

    列表索引显示列表视图的索引截屏如何使用运行示例应用程序。... ListView android : id = " @+id/item_list " android : layout_width = " match_parent " android : layout_height = " match_parent "

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

Global site tag (gtag.js) - Google Analytics