先看效果:
实现起来也很简单,就一个类,注释都有。
直接看代码:
/**
* 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
分享到:
相关推荐
通讯录选择器,通讯录显示,上边显示字符,下边显示字符通讯录名称所对应的名字,同时Dmeo中还带有搜索功能,比如输入Z,自动出现曾一鸣..等等.最右边一排快速滑动时,会出现和显示ABCD....和小米一样的选择效果!
这个项目"Android 仿通讯录A-Z侧边索引查询 LetterListView androidstudio"是针对这一需求的具体实现,它使用了Android Studio作为开发环境。下面我们将详细探讨其中涉及到的关键知识点。 1. **LetterListView**: ...
总结来说,实现“仿微信通讯录,A~Z拼音侧边检索”功能涉及到的关键技术包括汉字到拼音的转换、数据结构设计、筛选与排序算法、用户界面设计以及性能优化。通过这些技术的应用,我们可以创建一个高效、易用的通讯录...
1. `picker`选择器:用户可以选择联系人首字母,快速定位到相应区域。 2. `view`视图:显示联系人列表,每个联系人作为一个独立的`view`项。 3. `text`文本:展示联系人的姓名、电话等信息。 4. `button`按钮:可能...
- 对查询到的姓名进行排序,可以使用Collections.sort()方法,自定义比较器Comparator,基于字符的Unicode值进行比较。 - 为了便于展示,通常会将所有字母按A到Z创建一个索引列表。 3. **索引构建**: - 分析...
这样,用户可以通过快速浏览A到Z的索引来找到所需联系人。为了使用户能够更容易地浏览,可以在屏幕的一侧添加一个可滑动的字母条,当用户点击特定字母时,列表自动滚动到相应区域。 搜索框筛选功能则依赖于输入法...
D. *建立函数create:根据一维数组a[n]建立一个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)。 E. *整理函数tideup:在非递减有序的单链表中删除值相同的多余...
这个设计通常包含一个垂直的侧边栏,显示26个英文字母(A到Z),用户点击某个字母后,通信录列表会滚动到相应首字母的联系人处。 实现这一功能,开发者需要考虑以下几个关键点: 1. **数据结构**:首先,通讯录...
它通常出现在通讯录界面的右侧,显示A到Z的字母,用户只需点击相应字母,就能跳转到该字母开头的联系人列表。这一功能对于拥有大量联系人的用户来说非常实用,因为它极大地减少了手动滑动屏幕寻找特定联系人的时间。...