安卓仿微信联系人快速索引

半成品效果图:

代码

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import com.example.z.xxxx.R;

/**
 * Created by z on 2017/9/21.
 */

public class SlideBar extends View {

    private static final String[] BAR_LETTERS = {"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", "#"};
    private Paint paint = new Paint();
    private int selectIndex = -1;//选项的数组下标
    private onTouchLetterListener onTouchLetterListener;
    private boolean isShowBkg = false;//背景是否变化

    public SlideBar(Context context) {
        super(context);
    }

    public SlideBar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public SlideBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface onTouchLetterListener {
        void onTouchLetterChange(String letter,boolean touch);
    }

    public void setOnTouchLetterListener(onTouchLetterListener onTouchLetterListener) {
        this.onTouchLetterListener = onTouchLetterListener;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isShowBkg == true) {
            canvas.drawColor(getResources().getColor(R.color.text_backgroud_color));//显示背景
        }
        int height = getHeight();
        int width = getWidth();
        int singleHeight = (height - 20) / BAR_LETTERS.length;//每个字母占得高度
        System.out.println(height + "-------" + width);

        for (int i = 0; i < BAR_LETTERS.length; i++) {//遍历字母

            paint.setColor(getResources().getColor(R.color.text_color));
            paint.setTextSize(50);
            paint.setAntiAlias(true);//设置抗锯齿样式
            System.out.println(i+"-----"+selectIndex);
            if (i == selectIndex) {//如果被选中
                System.out.println(i+"*****"+selectIndex);
                paint.setColor(getResources().getColor(R.color.isread_true));
                paint.setFakeBoldText(true);//加粗
            }
            //从左下角开始绘制
            float xpos = (width - paint.measureText(BAR_LETTERS[i])) / 2;//x轴
            float ypos = singleHeight * i + singleHeight;//y轴 (i从0开始算)
//            System.out.println(xpos + "<------->" + ypos);
            canvas.drawText(BAR_LETTERS[i], xpos, ypos, paint);//开始绘制
            paint.reset();//重置画笔
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        int action = event.getAction();
        float ypos = event.getY();
        int oldSelectIndex = selectIndex;//上一次触发的坐标
        int newSelectIndex = (int) (ypos / getHeight() * BAR_LETTERS.length);//根据触摸的位置确定点的哪个字母

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                isShowBkg = true;
                if (onTouchLetterListener != null && oldSelectIndex != newSelectIndex
                        && newSelectIndex >= 0 && newSelectIndex <= BAR_LETTERS.length) {
                    onTouchLetterListener.onTouchLetterChange(BAR_LETTERS[newSelectIndex],true);//注册点击事件并传入字母
                    oldSelectIndex = newSelectIndex;
                    selectIndex=newSelectIndex;
                    invalidate();//重新绘制

                }
                break;
            case MotionEvent.ACTION_UP:

                isShowBkg = false;
                selectIndex = -1;
                invalidate();
                onTouchLetterListener.onTouchLetterChange(BAR_LETTERS[newSelectIndex],false);//注册点击事件并传入字母
                break;
            case MotionEvent.ACTION_MOVE:
                if (onTouchLetterListener != null && oldSelectIndex != newSelectIndex
                        && newSelectIndex >= 0 && newSelectIndex <= BAR_LETTERS.length) {
                    onTouchLetterListener.onTouchLetterChange(BAR_LETTERS[newSelectIndex],true);//注册点击事件并传入字母
                    oldSelectIndex = newSelectIndex;
                    selectIndex=newSelectIndex;
                    invalidate();//重新绘制

                }
                break;
        }

        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

界面:

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

    <include layout="@layout/item_toolbar"></include>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_txl_list_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rcv_txl_list_main"

                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

            <com.example.z.dlydbg.widget.slidebar.SlideBar
                android:id="@+id/slb_txl_main"
                android:layout_width="30dp"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:paddingBottom="10dp"
                android:paddingTop="10dp" />

            <TextView
                android:id="@+id/tv_txl_list_flot"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerHorizontal="true"
                android:layout_centerInParent="true"
                android:layout_centerVertical="true"
                android:background="@drawable/text_float_btn_background"
                android:gravity="center"
                android:text="V"
                android:textColor="@color/white"
                android:textSize="60sp"
                android:visibility="gone" />
        </RelativeLayout>
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

activity:

public class TxlListActivity extends BaseActivity implements SlideBar.onTouchLetterListener {

    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.slb_txl_main)
    SlideBar slbTxlMain;
    @BindView(R.id.tv_txl_list_flot)
    TextView tvTxlListFlot;
    @BindView(R.id.rcv_txl_list_main)
    RecyclerView rcvTxlListMain;
    @BindView(R.id.srl_txl_list_main)
    SwipeRefreshLayout srlTxlListMain;

    private String bmdm, bmmc;

    @Override
    public int getContentViewId() {
        return R.layout.activity_txl_list;
    }

    @Override
    public void initToolBar() {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bmdm = getIntent().getExtras().getString("bmdm");
        bmmc = getIntent().getExtras().getString("bmmc");
        setToolBar(toolbar, bmmc, 0);
        slbTxlMain.setOnTouchLetterListener(this);
    }

    @Override
    public void onTouchLetterChange(String letter, boolean touch) {
        if (touch) {
            srlTxlListMain.setEnabled(false);//解决下拉冲突
            tvTxlListFlot.setText(letter);
            tvTxlListFlot.setVisibility(View.VISIBLE);
        } else {
            srlTxlListMain.setEnabled(true);
            tvTxlListFlot.setVisibility(View.GONE);
        }
    }
}
时间: 2024-10-29 15:03:42

安卓仿微信联系人快速索引的相关文章

带中文索引的ListView 仿微信联系人列表

由于各种原因,项目经理和产品经理把我做的东西给否定了,所以决定分享出去. 主要功能: 1 .带中文索引的ListView 2.自定义顶部搜索视图,可以对返回按钮,搜索按钮添加事件监听,带动画的咧!~ 3.底部自定义视图,可以对Listview的adapter添加监听,并且回调选中的数目,另外其他的视图都是可以自己添加的 4.右侧的索引视图,根据通讯录的解析后的数据动态生成相关索引列表 5.Adapter的抽象类,想优化自己的Adapter可以看一下,例子中的adapter仅仅是特例特写. 6.分

手机联系人快速索引

这是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂.下面上源码:源码中有注释. MainActivity: import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.

动手分析安卓仿QQ联系人列表TreeView控件

因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码.   一. 需要用到的知识如下: ①安卓事件分发机制:(http://blog.csdn.net/lvxiangan/article/details/9309927  或 http://gundumw100.iteye.com/blog/1052270) ②安卓View绘制:http://blog.csdn.net/

安卓仿微信Tab页用Fragment实现

最终效果图如: 实现步骤: 新建项目tabdemo,我选的是4.0.3版本,然后依次新建三个Fragment,名字分别为:ChatFragment.FriendFragment.FindFragment,他会生成对应的界面布局xml文件. 项目资源管理器结构如下: Drawable中是用到的三张图片,可自行找然后粘进去. 对应的Java代码如下: package com.example.administrator.tabdemo; import android.content.Context;

安卓仿微信右上角弹出菜单窗口

import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import com.cnmobile.beibei.

Android 仿微信联系人Demo

项目结构 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_par

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或

Android 快速索引(城市列表和联系人)

最近需要实现一个城市列表的快速索引功能.类似于联系人应用,根据姓名首字母快速索引功能. 要实现这个功能只需要解决两个问题: 1.对列表进行分组(具有同一特征),并且能够快速定位到该组的第一项 2.右侧分组'特征'快速索引栏的实现 第一个问题比较好解决,列表项可以根据相同的'特征'来分组,比如说城市列表可以根据相同首字母的城市名来进行分组. 如何来定位到分组的第一项,只需要把分组的'特征'和分组第一项下标关联起来,快速索引栏就能快速定位分组第一项 第二个问题可以通过自定义控件来实现,实现的形式有很

安卓开发复习笔记——ViewPager组件(仿微信引导界面&gt;)

这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包. 通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面. 先来看下效果图:     这是一个