`
bkship
  • 浏览: 47865 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

通讯录侧边栏快速滑动效果的实现

 
阅读更多
那,我原创的文章比较少,所以基本上都是自己看了,然后稍加修改的!

综合这两个帖子:
http://blog.csdn.net/ilysony/article/details/6292771
http://blog.csdn.net/yan_daoqiu/article/details/6393300

中文的还没去实验
[img]
我不知道怎么传图 - - !
[/img]


大概思路就是在listView里面设置了 section,然后侧边栏是一个自定义的组件

侧边栏ontouch中会去 让listview 跳到相应位置list.setSelection();

listview中设置onScroll监听器,滑动时候让中间弹出windows,不滑动时候隐藏

window中显示的就是首字母。

侧边栏代码
public class SideBar extends View{

	private char[] l;  
    private SectionIndexer sectionIndexter = null;  
    private ListView list;  
    private final int m_nItemHeight = 29;  
    public SideBar(Context context) {  
        super(context);  
        init();  
    }  
    public SideBar(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();  
    }  
    private void init() {  
        l = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',  
                'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };  
        setBackgroundColor(0x44FFFFFF);  
    }  
    public SideBar(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        init();  
    }  
    public void setListView(ListView _list) {  
        list = _list;  
        sectionIndexter = (SectionIndexer) _list.getAdapter();  
    }  
    public boolean onTouchEvent(MotionEvent event) {  
        super.onTouchEvent(event);  
        int i = (int) event.getY();  
        int idx = i / m_nItemHeight;  
        if (idx >= l.length) {  
            idx = l.length - 1;  
        } else if (idx < 0) {  
            idx = 0;  
        }  
        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {  
            if (sectionIndexter == null) {  
                sectionIndexter = (SectionIndexer) list.getAdapter();  
            }  
            int position = sectionIndexter.getPositionForSection(l[idx]);  
            if (position == -1) {  
                return true;  
            }  
            list.setSelection(position);  
        }  
        return true;  
    }  
    protected void onDraw(Canvas canvas) {  
        Paint paint = new Paint();  
        paint.setColor(0xFFA6A9AA);  
        paint.setTextSize(20);  
        paint.setTextAlign(Paint.Align.CENTER);  
        float widthCenter = getMeasuredWidth() / 2;  
        for (int i = 0; i < l.length; i++) {  
            canvas.drawText(String.valueOf(l[i]), widthCenter, m_nItemHeight + (i * m_nItemHeight), paint);  
        }  
        super.onDraw(canvas);  
    }  
	
	

}



listView的adapter
涉及到section的显示 以及 sidebar中要获取positon的方法


public class MyAdapter extends BaseAdapter implements SectionIndexer{
	private ArrayList<String> stringArray;  
    private Context context;  
    public MyAdapter(Context _context, ArrayList<String> arr) {  
        stringArray = arr;  
        context = _context;  
    }  
    public int getCount() {  
        return stringArray.size();  
    }  
    public Object getItem(int arg0) {  
        return stringArray.get(arg0);  
    }  
    public long getItemId(int arg0) {  
        return 0;  
    }  
    public View getView(int position, View v, ViewGroup parent) {  
        LayoutInflater inflate = ((Activity) context).getLayoutInflater();  
        View view = (View) inflate.inflate(R.layout.listview_row, null);  
        LinearLayout header = (LinearLayout) view.findViewById(R.id.section);  
        String label = stringArray.get(position);  
        char firstChar = label.toUpperCase().charAt(0);  
        if (position == 0) {  
            setSection(header, label);  
        } else {  
            String preLabel = stringArray.get(position - 1);  
            char preFirstChar = preLabel.toUpperCase().charAt(0);  
            if (firstChar != preFirstChar) {  
                setSection(header, label);  
            } else {  
                header.setVisibility(View.GONE);  
            }  
        }  
        TextView textView = (TextView) view.findViewById(R.id.textView);  
        textView.setText(label);  
        return view;  
    }  
    private void setSection(LinearLayout header, String label) {  
        TextView text = new TextView(context);  
        header.setBackgroundColor(0xffaabbcc);  
        text.setTextColor(Color.WHITE);  
        text.setText(label.substring(0, 1).toUpperCase());  
        text.setTextSize(20);  
        text.setPadding(5, 0, 0, 0);  
        text.setGravity(Gravity.CENTER_VERTICAL);  
        header.addView(text);  
    }  
    public int getPositionForSection(int section) {  
        if (section == 35) {  
            return 0;  
        }  
        for (int i = 0; i < stringArray.size(); i++) {  
            String l = stringArray.get(i);  
            char firstChar = l.toUpperCase().charAt(0);  
            if (firstChar == section) {  
                return i;  
            }  
        }  
        return -1;  
    }  
    public int getSectionForPosition(int arg0) {  
        return 0;  
    }  
    public Object[] getSections() {  
        return null;  
    }  
}



主程序的中显示的window相关:

TextView 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)
                        );
        
        list.setOnScrollListener(onScroll);

	OnScrollListener onScroll = 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(list.getItemAtPosition(firstVisibleItem).toString().substring(0, 1)); 
	            overlay.setVisibility(View.VISIBLE); 
	        } 
	    }
	
	};






分享到:
评论

相关推荐

    android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

    本教程聚焦于创建一个仿通讯录侧边栏滑动效果,实现A-Z字母检索的功能。这个功能常见于许多手机应用中,用于快速定位和筛选以特定字母开头的联系人。 首先,我们要理解自定义View的基本概念。自定义View是通过继承...

    Android仿微信通讯录侧边栏

    综上所述,"Android仿微信通讯录侧边栏"是一个集成了布局设计、数据处理、动画效果和用户交互的综合项目,开发者需要掌握多种Android开发技能才能实现。通过对以上知识点的理解和实践,可以开发出具有微信通讯录侧...

    Android实现仿通讯录侧边栏滑动SiderBar效果代码

    在Android开发中,实现仿通讯录侧边栏滑动SiderBar效果是一种常见的交互设计,通常用于快速定位列表中的内容。SiderBar通常包含26个英文字母(以及可能的其他字符,如#)作为索引,用户可以通过滑动选择对应的字母,...

    安卓仿通讯录及微信联系人侧边栏滑动及字母索引

    首先,我们需要自定义一个控件来模拟通讯录的侧边栏滑动效果。这个控件通常是一个可滚动的侧滑菜单,它会显示字母表,用户可以通过滑动选择相应的首字母来快速定位到联系人。在Android中,我们可以使用`...

    Android 侧边栏快速索引

    在Android应用开发中,侧边栏快速索引是一种常见的交互设计,它借鉴了手机通讯录的查找方式,为长列表提供了高效便捷的导航。这种功能可以让用户通过点击或滑动侧边栏的字母来快速定位到目标内容,极大提升了用户...

    Android仿通讯录侧边快速定位效果

    这个效果使得用户可以通过滑动侧边栏快速跳转到字母表中的特定位置,提高用户体验。下面我们将深入探讨实现这一功能所涉及的技术点。 1. **侧边栏(SideBar)组件**: 侧边栏通常是一个水平滚动的视图,包含字母表的...

    Android侧边栏快速定位控件

    在Android应用开发中,侧边栏快速定位控件是一种常见的用户界面元素,它极大地提高了用户在长列表中的浏览效率。这种功能通常出现在通讯录、音乐播放器或任何包含大量分类数据的应用中。在这个主题中,我们将深入...

    swift-UITableViewIndexBar快速索引栏侧边栏字母索引栏通讯录可以自定义各种效果以及动画

    这个“swift-UITableViewIndexBar快速索引栏侧边栏字母索引栏通讯录”项目,旨在帮助开发者实现一个功能完备且高度可定制的快速索引栏,其特性包括自定义效果和动画,非常适合于类似通讯录的应用场景。 首先,快速...

    Android仿微信通讯录列表侧边栏效果

    在Android开发中,实现“仿微信通讯录列表侧边栏效果”是一种常见需求,它可以提供用户友好的体验,便于快速定位联系人。该效果的主要特点是根据联系人的首字符拼音进行排序,并通过侧边栏的字母索引来定位。下面将...

    Android快速索引:实现微信通讯录效果

    这个功能通常会在一个ListView或RecyclerView中实现,通过一个可滑动的侧边栏来显示字母索引,用户点击某个字母时,会跳转到对应的联系人列表部分。在实现这个功能时,我们主要会涉及到以下几个关键知识点: 1. **...

    android快速滑动列表+首字母提示(仿通讯录,iphone)

    要实现快速滑动功能,我们首先需要创建一个侧边栏(SideBar)组件。这个侧边栏通常是一个垂直滚动条,包含所有字母,用户可以触摸字母来跳转到对应的联系人列表位置。我们可以自定义一个View,绘制出这些字母,并...

    仿微信通讯录列表

    通常,这样的设计会包含一个可滑动的侧边栏(一般显示字母表),用户可以通过滑动侧边栏快速定位到相应姓名首字母的联系人。在顶部的ListView用于展示群组,而下方的ListView则展示按字母排序的个人联系人。 1. **...

    Android应用源码 快速滑动 list 仿QQ通讯录.zip

    - 为了实现快速滑动功能,首先在XML布局文件中添加`FastScroller`,然后在Activity或Fragment中绑定并设置相应的属性。 - 实现`SectionIndexer`接口,为`ListView`提供分段信息。 - 设置`ListView`的`...

    通信录联系人拼音侧边栏

    实现"通信录联系人拼音侧边栏"涉及到以下几个关键知识点: 1. **数据处理**:首先,需要将通讯录中的联系人姓名转换为拼音。这通常需要使用到汉字到拼音的转换库,如Android平台上的`Pinyin4j`或iOS平台上的`...

    [Android实例] 仿微信通讯录,A~Z拼音侧边检索

    为了实现滑动选择效果,需要监听侧边栏的滑动事件。可以通过`OnTouchListener`或自定义滑动监听器实现,当手指滑过字母时高亮显示,离开时恢复原状。 7. **性能优化** 对于大量联系人,处理拼音和过滤操作可能会...

    手机通信录滑动abcd实现

    这个设计通常包含一个垂直的侧边栏,显示26个英文字母(A到Z),用户点击某个字母后,通信录列表会滚动到相应首字母的联系人处。 实现这一功能,开发者需要考虑以下几个关键点: 1. **数据结构**:首先,通讯录...

    ListView 实现点击侧边A-Z快速查找_Android.rar

    在处理大量数据时,为了提高用户的搜索效率,我们常常需要实现类似通讯录那样的A-Z快速查找功能。这个"ListView 实现点击侧边A-Z快速查找"的项目,旨在帮助用户通过点击字母导航栏快速定位到目标数据项。下面将详细...

    获取系统通讯录加搜索功能

    3. **侧边栏效果**:侧边栏通常用于显示字母索引,方便用户快速定位联系人。这种效果可以通过创建一个自定义视图实现,视图包含一个滚动视图,显示所有字母,当用户点击某个字母时,根据Contacts数据过滤出以该字母...

Global site tag (gtag.js) - Google Analytics