IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android系统联系人全特效实现(下),字母表快速滚动,小程序开发教程 -> 正文阅读

[移动开发]Android系统联系人全特效实现(下),字母表快速滚动,小程序开发教程

			alphabetButton.setBackgroundResource(R.drawable.a_z);
			sectionToastLayout.setVisibility(View.GONE);
		}
		return true;
	}
});

}


二
-

可以看到,在这个方法中我们注册了字母表按钮的 onTouch 事件,然后在 onTouch 方法里做了一些逻辑判断和处理,下面我来一一详细说明。首先通过字母表按钮的 getHeight 方法获取到字母表的总高度,然后用 event.getY 方法获取到目前手指在字母表上的纵坐标,用纵坐标除以总高度就可以得到一个用小数表示的当前手指所在位置 (0 表在 #端,1 表示在 Z 端)。由于我们的字母表中一共有 27 个字符,再用刚刚算出的小数再除以 1/27 就可以得到一个 0 到 27 范围内的浮点数,之后再把这个浮点数向下取整,就可以算出我们当前按在哪个字母上了。然后再对 event 的 action 进行判断,如果是 ACTION\_DOWN 或 ACTION\_MOVE,就在弹出式分组上显示当前手指所按的字母,并调用 ListView 的 setSelection 方法把列表滚动到相应的分组。如果是其它的 action,就将弹出式分组布局隐藏。

MainActivity 的完整代码如下:

public class MainActivity extends Activity {

/**
 * 分组的布局
 */
private LinearLayout titleLayout;

/**
 * 弹出式分组的布局
 */
private RelativeLayout sectionToastLayout;

/**
 * 右侧可滑动字母表
 */
private Button alphabetButton;

/**
 * 分组上显示的字母
 */
private TextView title;

/**
 * 弹出式分组上的文字
 */
private TextView sectionToastText;

/**
 * 联系人ListView
 */
private ListView contactsListView;

/**
 * 联系人列表适配器
 */
private ContactAdapter adapter;

/**
 * 用于进行字母表分组
 */
private AlphabetIndexer indexer;

/**
 * 存储所有手机中的联系人
 */
private List<Contact> contacts = new ArrayList<Contact>();

/**
 * 定义字母表的排序规则
 */
private String alphabet = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/**
 * 上次第一个可见元素,用于滚动时记录标识。
 */
private int lastFirstVisibleItem = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	adapter = new ContactAdapter(this, R.layout.contact_item, contacts);
	titleLayout = (LinearLayout) findViewById(R.id.title_layout);
	sectionToastLayout = (RelativeLayout) findViewById(R.id.section_toast_layout);
	title = (TextView) findViewById(R.id.title);
	sectionToastText = (TextView) findViewById(R.id.section_toast_text);
	alphabetButton = (Button) findViewById(R.id.alphabetButton);
	contactsListView = (ListView) findViewById(R.id.contacts_list_view);
	Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
	Cursor cursor = getContentResolver().query(uri,
			new String[] { "display_name", "sort_key" }, null, null, "sort_key");
	if (cursor.moveToFirst()) {
		do {
			String name = cursor.getString(0);
			String sortKey = getSortKey(cursor.getString(1));
			Contact contact = new Contact();
			contact.setName(name);
			contact.setSortKey(sortKey);
			contacts.add(contact);
		} while (cursor.moveToNext());
	}
	startManagingCursor(cursor);
	indexer = new AlphabetIndexer(cursor, 1, alphabet);
	adapter.setIndexer(indexer);
	if (contacts.size() > 0) {
		setupContactsListView();
		setAlpabetListener();
	}
}

/**
 * 为联系人ListView设置监听事件,根据当前的滑动状态来改变分组的显示位置,从而实现挤压动画的效果。
 */
private void setupContactsListView() {
	contactsListView.setAdapter(adapter);
	contactsListView.setOnScrollListener(new OnScrollListener() {
		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
				int totalItemCount) {
			int section = indexer.getSectionForPosition(firstVisibleItem);
			int nextSecPosition = indexer.getPositionForSection(section + 1);
			if (firstVisibleItem != lastFirstVisibleItem) {
				MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams();
				params.topMargin = 0;
				titleLayout.setLayoutParams(params);
				title.setText(String.valueOf(alphabet.charAt(section)));
			}
			if (nextSecPosition == firstVisibleItem + 1) {
				View childView = view.getChildAt(0);
				if (childView != null) {
					int titleHeight = titleLayout.getHeight();
					int bottom = childView.getBottom();
					MarginLayoutParams params = (MarginLayoutParams) titleLayout
							.getLayoutParams();
					if (bottom < titleHeight) {
						float pushedDistance = bottom - titleHeight;
						params.topMargin = (int) pushedDistance;
						titleLayout.setLayoutParams(params);
					} else {
						if (params.topMargin != 0) {
							params.topMargin = 0;
							titleLayout.setLayoutParams(params);
						}
					}
				}
			}
			lastFirstVisibleItem = firstVisibleItem;
		}
	});

}

/**
 * 设置字母表上的触摸事件,根据当前触摸的位置结合字母表的高度,计算出当前触摸在哪个字母上。
 * 当手指按在字母表上时,展示弹出式分组。手指离开字母表时,将弹出式分组隐藏。
 */
private void setAlpabetListener() {
	alphabetButton.setOnTouchListener(new OnTouchListener() {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			float alphabetHeight = alphabetButton.getHeight();
			float y = event.getY();
			int sectionPosition = (int) ((y / alphabetHeight) / (1f / 27f));
			if (sectionPosition < 0) {
				sectionPosition = 0;
			} else if (sectionPosition > 26) {
				sectionPosition = 26;
			}
			String sectionLetter = String.valueOf(alphabet.charAt(sectionPosition));
			int position = indexer.getPositionForSection(sectionPosition);
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				alphabetButton.setBackgroundResource(R.drawable.a_z_click);
				sectionToastLayout.setVisibility(View.VISIBLE);
				sectionToastText.setText(sectionLetter);
				contactsListView.setSelection(position);
				break;
			case MotionEvent.ACTION_MOVE:
				sectionToastText.setText(sectionLetter);
				contactsListView.setSelection(position);
				break;
			default:
				alphabetButton.setBackgroundResource(R.drawable.a_z);
				sectionToastLayout.setVisibility(View.GONE);
			}
			return true;
		}
	});
}

/**
 * 获取sort key的首个字符,如果是英文字母就直接返回,否则返回#。
 * 
 * @param sortKeyString
 *            数据库中读取出的sort key
 * @return 英文字母或者#
 */
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:51:10  更:2021-09-08 10:52:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:44:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码