`
zhangfy068
  • 浏览: 147133 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

侧边字母索引栏的使用

 
阅读更多


 

 

自定义一个view 绘制

package com.lolo.my361.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class LetterlistViewForFriend extends View {

	public LetterlistViewForFriend(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
	public LetterlistViewForFriend(Context context)
	{
		super(context);
	}

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

	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;

	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		
		if (showBkg)
		{
			canvas.drawColor(Color.parseColor("#40000000"));
		}
		
		int height = getHeight();
		int width = getWidth();
		int singleHeight = height / b.length;
		//循环绘制字母
		for (int i = 0; i < b.length; i++)
		{
			//paint.setTextSize(19) ;
			paint.setColor(Color.BLACK);
			paint.setTypeface(Typeface.DEFAULT_BOLD);
			
			paint.setAntiAlias(true);
			if (i == choose)
			{
				//被选中了改变文字颜色
				paint.setColor(Color.parseColor("#3399ff"));
				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();
		}

	}

	@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);

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			showBkg = true;
			if (oldChoose != c && listener != null)
			{
				if (c > 0 && c < b.length)
				{
					listener.onTouchingLetterChanged(b[c]);
					choose = c;
					invalidate();
				}
			}

			break;
		case MotionEvent.ACTION_MOVE:
			if (oldChoose != c && listener != null)
			{
				if (c > 0 && c < b.length)
				{
					listener.onTouchingLetterChanged(b[c]);
					choose = c;
					invalidate();
				}
			}
			break;
		case MotionEvent.ACTION_UP:
			showBkg = true;
			if (oldChoose != c && listener != null)
			{
				if (c > 0 && c < b.length)
				{
					//回调
					listener.onTouchingLetterChanged(b[c]);
					choose = c;
					invalidate();
				}
			}
			
			break;
		}
		return true;
	}

	
	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		return super.onTouchEvent(event);
	}
	//方便Activity类调用,用于显示
	public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener)
	{
		this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
	}

	public interface OnTouchingLetterChangedListener
	{
		public void onTouchingLetterChanged(String s);
	}
}

 
 

	// 初始化汉语拼音首字母弹出提示框
	private void initOverlay() {
		LayoutInflater inflater = LayoutInflater.from(this);
		overlay = (TextView) inflater.inflate(R.layout.overlay_layout, null);
		overlay.setVisibility(View.INVISIBLE);
		WindowManager.LayoutParams lp = 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);
		WindowManager windowManager = (WindowManager) this
				.getSystemService(Context.WINDOW_SERVICE);
		windowManager.addView(overlay, lp);
	}

 触摸的时候显示字母,且ListView自动滚动该字母列

letterlistViewForFriend.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
			
			@Override
			public void onTouchingLetterChanged(String s) {
				// TODO Auto-generated method stub
				System.out.println(s);
				int position = alphaIndex.get(s);
				//listView 滚动到选择的字母那个地方。
				if (alphaIndex.get(s) != null) {
					lv_friend.setSelection(position);
				}
				overlay.setText(s);
				overlay.setVisibility(View.VISIBLE);
				handler.removeCallbacks(overlayThread);
				// 延迟一秒后执行,让overlay为不可见
				handler.postDelayed(overlayThread, 1500);
			}
		});

 

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

相关推荐

    侧边字母索引demo

    文件资源为侧边字母索引demo,通过自定义SideIndexBar画出字母,然后处理其touch事件,然后再设置list的position,即可达到功能要求,这里list的item只是字符串,如果有更为复杂的list,则需要修改getLetterPosition方法.

    侧边字母索引快速查找列表项.zip

    侧边字母索引快速查找列表项

    Android字母侧边索引

    5. **侧边索引栏**:实现侧边索引栏则需要额外的工作。你可能需要创建一个单独的View,监听用户的触摸事件,当用户点击特定字母时,计算并跳转到对应的ListView位置。为了计算准确的位置,你需要遍历数据源,找到...

    js+css3侧边栏滚动显示首字母索引特效

    当用户点击侧边栏中的字母时,JS需要获取并计算对应首字母的所有元素在页面上的位置,然后滚动页面使这些元素进入视口。此外,可能还需要实现滚动监听,当页面滚动时自动高亮当前可视区域内的首字母。 4. **DOM操作...

    安卓字母索引列表

    而字母索引则是一个可触摸的侧边栏,通常称为“索引栏”或“快速导航栏”。 实现字母索引列表的关键在于计算每个条目相对于整个列表的相对位置,并将其映射到对应的字母。这涉及到对数据源的预处理,即根据首字母对...

    Android 实现带字母索引的侧边栏功能

    在这里,我们可以使用Paint类来绘制侧边栏,并且使用OnTouchingLetterChangedListener来监听字母索引的变化。这里的OnTouchingLetterChangedListener是一个接口,它有两个方法:onHit和onCancel。onHit方法是当用户...

    Android字母索引ListView

    `Android字母索引ListView`是ListView的一个增强版,它模仿了微信等应用中常见的联系人列表功能,允许用户通过点击屏幕侧边的字母栏快速跳转到对应首字母的条目,提高用户体验。这个实现通常涉及到自定义Adapter、...

    Android 侧边栏字母索引排序demo

    字母索引排序是Android侧边栏中的常见功能,它可以帮助用户快速定位和访问列表中的特定项。这个“Android 侧边栏字母索引排序demo”是一个实践示例,用于演示如何在Android应用中实现这一特性。 首先,我们要理解...

    ListView实现字母索引(类似通讯录)

    本教程将深入讲解如何在ListView中实现字母索引功能。 首先,我们需要理解字母索引的基本原理。在通讯录应用中,当你滚动列表时,侧边会出现一个可点击的字母栏,点击特定字母会跳转到对应首字母的联系人。在...

    通讯录使用侧栏字母索引

    实现侧边字母索引 http://blog.csdn.net/q1113225201/article/details/53574210

    带字母索引的ListView

    首先,我们需要创建一个自定义的ListView,它包含主列表和侧边的字母索引栏。这可以通过在一个垂直方向的LinearLayout中放置ListView和一个HorizontalScrollView来实现。HorizontalScrollView将承载表示字母的...

    用RecyclerView实现字母排序

    为此,可以创建一个Map来存储每个字母及其对应的索引。 4. **绘制分隔符** 在`onDrawOver()`方法中,使用Canvas对象来绘制分隔符。你可以选择合适的颜色、字体和样式,使其符合应用的UI风格。注意要考虑到...

    ListView使用索引字母

    5. **HeaderView和FooterView**:在`ListView`的顶部或底部添加一个Header或Footer视图,用于显示索引字母栏。可以使用`addHeaderView()`或`addFooterView()`方法添加。 6. **侧滑监听**:为了响应用户在侧边滑动...

    android字母索引listview

    为了解决这个问题,开发者通常会使用带有字母索引的ListView,也称为AlphabetIndexer或SectionIndexer。这样的设计允许用户通过点击侧边的字母栏,迅速跳转到对应的列表项,极大地提升了用户体验。 **1. Android ...

    sticky-index,一个提供“粘滞字母索引”的库,如在上的android棒棒糖(api 21)的android联系人应用程序中提供的。.zip

    它能帮助用户快速浏览和定位长列表中的特定条目,通过在侧边显示一个可点击的字母索引栏,用户可以一键跳转到相应字母开头的项目,极大地提升了用户体验。 这个库特别适合那些需要处理大量数据并希望提高用户界面...

    按字母索引滑动

    2. **字母索引生成**:生成字母索引栏通常涉及创建一个包含所有可能首字母的数组或列表。例如,在中文环境中,可能会包括所有常用汉字的首字母(在拼音表示下)。在英文环境中,就是简单的26个字母。 3. **事件监听...

    仿微信侧边索引快速搜索

    android 仿微信侧边索引快速搜索

    安卓Android源码——按字母索引滑动.zip

    在实现字母索引滑动时,通常会在侧边添加一个“字母栏”或“索引条”,用户可以点击相应的字母快速跳转到对应开头的列表项。 1. **字母栏(AlphabetIndexer)**:这是实现字母索引的关键部分。AlphabetIndexer接口...

Global site tag (gtag.js) - Google Analytics