写点什么

Android 系统联系人全特效实现 (下),字母表快速滚动,android 开发网上购物 app

  • 2021 年 11 月 05 日
  • 本文字数:2608 字

    阅读完需:约 9 分钟

android:layout_alignParentTop="true"android:scrollbars="none"android:fadingEdge="none" ></ListView>


<LinearLayoutandroid:id="@+id/title_layout"android:layout_width="fill_parent"android:layout_height="18dip"android:layout_alignParentTop="true"android:background="#303030" >


<TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginLeft="10dip"android:textColor="#ffffff"android:textSize="13sp" /></LinearLayout>


<Buttonandroid:id="@+id/alphabetButton"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentRight="true"android:background="@drawable/a_z"/>


<RelativeLayoutandroid:id="@+id/section_toast_layout"android:layout_width="70dip"android:layout_height="70dip"android:layout_centerInParent="true"android:background="@drawable/section_toast"android:visibility="gone"



<TextViewandroid:id="@+id/section_toast_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="#fff"android:textSize="30sp"/></RelativeLayout>


</RelativeLayout>


然后打开 MainActivity 进行修改,毫无疑问,我们需要对字母表按钮的 touch 事件进行监听,于是在 MainActivity 中新增如下代码:


private void setAlpabetListener() {alphabetButton.setOnTouchListener(new OnTouchListener() {@Overridepublic 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;}});}

可以看到,在这个方法中我们注册了字母表按钮的 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;


@Overrideprotected 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();}}


/**


  • 为联系人 Lis


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


tView 设置监听事件,根据当前的滑动状态来改变分组的显示位置,从而实现挤压动画的效果。*/private void setupContactsListView() {contactsListView.setAdapter(adapter);

评论

发布
暂无评论
Android系统联系人全特效实现(下),字母表快速滚动,android开发网上购物app