`

通讯录中使用到的A-Z字符选择器

 
阅读更多

先看效果:

 

 

 

实现起来也很简单,就一个类,注释都有。

直接看代码:

/**
 * The component of A to Z letter Bar.
 * 这个就是A-Z字符选择器
 * 
 * @author MichaelYe
 * @since 2012-8-22
 * */
public class AtoZLetterBar extends View 
{

	OnTouchingLetterChangedListener onTouchingLetterChangedListener;

	String[] b = {"#","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"};

	int choose = -1;

	Paint paint = new Paint();

	boolean showBkg = false;

	private Drawable thumbDrawable;

	public AtoZLetterBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context);
	}

	public AtoZLetterBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public AtoZLetterBar(Context context) {
		super(context);
		init(context);
	}

	private void init(Context context)
	{
		thumbDrawable = context.getResources().getDrawable(R.drawable.ic_launcher);
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
	    super.onDraw(canvas);
	    if(showBkg)
	    {
	        canvas.drawColor(Color.parseColor("#000000"));//#40000000 3399ff
	    }
	    
				//在手指接触屏幕的地方绘制图片
		thumbDrawable.setBounds(0, location - 60, this.getWidth(), location + 60);
		thumbDrawable.draw(canvas);
	
	    int height = getHeight();
	    int width = getWidth();
	    int singleHeight = height / b.length;
	    for(int i=0;i<b.length;i++)
	    {
	       paint.setColor(Color.GRAY);
	       paint.setTypeface(Typeface.DEFAULT_BOLD);
	       paint.setAntiAlias(true);
	       if(i == choose)
	       {
	         paint.setColor(Color.parseColor("#ff3355"));//手指选中时的颜色ff3355
	         paint.setTextSize(24);
	         paint.setFakeBoldText(true);
	         
	       }
	       float xPos = width/2  - paint.measureText(b[i])/2;
	       float yPos = singleHeight * i + singleHeight;
	       canvas.drawText(b[i], xPos, yPos, paint);
	       paint.reset();
	      
	    }
    
	}

	private int location = 0;//为了得到当前用户手指点击的位置
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent event) 
	{
	    final int action = event.getAction();
	    final float y = event.getY();
	    final int oldChoose = choose;
	    final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
	    final int c = (int) (y/getHeight()*b.length);
	
	    location = (int)y;
	    
	    switch (action) 
	    {
	        case MotionEvent.ACTION_DOWN:
	            showBkg = true;
	            if(oldChoose != c && listener != null)
	            {
	                if(c >= 0 && c< b.length)//这里的c要>=0,不然第一个字母不能正常显示
	                {
	                    listener.onTouchingLetterChanged(b[c]);
	                    choose = c;
	                    invalidate();
	                }
	            }
	
	            break;
	        case MotionEvent.ACTION_MOVE:
	            if(oldChoose != c && listener != null)
	            {
	                if(c >= 0 && c< b.length){//这里的c要>=0,不然第一个字母不能正常显示
	                    listener.onTouchingLetterChanged(b[c]);
	                    choose = c;
	                    invalidate();
	                }
	            }
	            break;
	        case MotionEvent.ACTION_UP:
	            showBkg = false;
	            choose = -1;
	            invalidate();
	            break;
	    }
	    return true;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
	    return super.onTouchEvent(event);
	}
	
	public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener)
	{
	    this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
	}
	
	/**
	 * 定义一个接口,用来传递所触摸的字符
	 * 
	 * */
	public interface OnTouchingLetterChangedListener
	{
	    public void onTouchingLetterChanged(String s);
	}

}
 

 

在布局文件中定义:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="60dip"
        android:layout_height="60dip"
        android:layout_centerInParent="true"
        android:background="#22568971"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textSize="35dip" />

    <com.michael.component.atoz.AtoZLetterBar
        android:id="@+id/selectbar"
        android:layout_width="30dip"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:background="#7fc2e9" />

</RelativeLayout>

 

在Activity中使用

/**
 * This Activity shows how to use the component of AtoZLetterListview
 * 
 * 这个类演示了如何使用字符选择器
 * 
 * @author MichaelYe
 * @since 2012-8-22
 * */
public class MainActivity extends Activity 
{
	
	private TextView tv;
	private Handler handler;
    private OverlayThread overlayThread;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv = (TextView)findViewById(R.id.textview);
        AtoZLetterBar azBar = (AtoZLetterBar)findViewById(R.id.selectbar);
        
        handler = new Handler();
        overlayThread = new OverlayThread();
        
        OnTouchingLetterChangedListener listener = new OnTouchingLetterChangedListener() 
        {
        	/**
        	 * Use Handler to remove call backs.
        	 * Make TextView Gone 1.5 second later
        	 * 
        	 * 使用Handler来移除让TextView不可见的Runnable
        	 * 并设置1.5秒后TextView不可见
        	 * 
        	 * */
			@Override
			public void onTouchingLetterChanged(String s) 
			{
				tv.setText(s);
				tv.setVisibility(View.VISIBLE);
				handler.removeCallbacks(overlayThread);
				handler.postDelayed(overlayThread, 1500);
			}
		};
		azBar.setOnTouchingLetterChangedListener(listener);
    }
    
    /**
     * Use Runnable to make TextView Gone
     * 
     * 通过使用Runnable来控制TextView的不可见
     * */									
    private class OverlayThread implements Runnable 
    {
        @Override
        public void run() 
        {
            tv.setVisibility(View.GONE);
        }
    }

}

 

发现问题欢迎指正。

项目下载地址:https://github.com/michaelye/DemoAtoZBar

 

 

 

  • 大小: 73.7 KB
分享到:
评论

相关推荐

    通讯录选择器A-Z

    通讯录选择器,通讯录显示,上边显示字符,下边显示字符通讯录名称所对应的名字,同时Dmeo中还带有搜索功能,比如输入Z,自动出现曾一鸣..等等.最右边一排快速滑动时,会出现和显示ABCD....和小米一样的选择效果!

    Android 仿通讯录A-Z侧边索引查询 LetterListView androidstudio

    这个项目"Android 仿通讯录A-Z侧边索引查询 LetterListView androidstudio"是针对这一需求的具体实现,它使用了Android Studio作为开发环境。下面我们将详细探讨其中涉及到的关键知识点。 1. **LetterListView**: ...

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

    总结来说,实现“仿微信通讯录,A~Z拼音侧边检索”功能涉及到的关键技术包括汉字到拼音的转换、数据结构设计、筛选与排序算法、用户界面设计以及性能优化。通过这些技术的应用,我们可以创建一个高效、易用的通讯录...

    微信小程序首字符排序-通讯录.rar

    1. `picker`选择器:用户可以选择联系人首字母,快速定位到相应区域。 2. `view`视图:显示联系人列表,每个联系人作为一个独立的`view`项。 3. `text`文本:展示联系人的姓名、电话等信息。 4. `button`按钮:可能...

    通讯录右边按照字母排序的索引查询

    - 对查询到的姓名进行排序,可以使用Collections.sort()方法,自定义比较器Comparator,基于字符的Unicode值进行比较。 - 为了便于展示,通常会将所有字母按A到Z创建一个索引列表。 3. **索引构建**: - 分析...

    Android通讯录RecyclerView实现

    这样,用户可以通过快速浏览A到Z的索引来找到所需联系人。为了使用户能够更容易地浏览,可以在屏幕的一侧添加一个可滑动的字母条,当用户点击特定字母时,列表自动滚动到相应区域。 搜索框筛选功能则依赖于输入法...

    数据结构(C++)有关练习题

    D. *建立函数create:根据一维数组a[n]建立一个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)。 E. *整理函数tideup:在非递减有序的单链表中删除值相同的多余...

    入门学习Linux常用必会60个命令实例详解doc/txt

    umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。 2.格式 unmount -a [-fFnrsvw] [-t vfstype] [-n] [-rw] [-F] device dir 3.使用说明 umount 命令是mount命令...

    手机通信录滑动abcd实现

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

    通信录联系人拼音侧边栏

    它通常出现在通讯录界面的右侧,显示A到Z的字母,用户只需点击相应字母,就能跳转到该字母开头的联系人列表。这一功能对于拥有大量联系人的用户来说非常实用,因为它极大地减少了手动滑动屏幕寻找特定联系人的时间。...

Global site tag (gtag.js) - Google Analytics