Android进阶-屏幕滑动和获取手机联系人

原创 2015年11月19日 20:19:08

Android进阶-屏幕滑动和获取手机联系人

屏幕滑动

如何使Activity之间的切换通过手势滑动来完成呢? 使用onTouchEvent()吗? 好像是可行? 但复杂的处理用户动作算法该由你自己来实现了,
可爱的Google已经帮我们实现了, 我们可以使用GestureDetetor对象来完成这件事。

实现步骤:

  • 将onTouchEvent()委托给GestureDetetor来处理。
  • 注册GestureDetetor的GestureListener, 并重写onFling()方法。
    • Fling 可以解释为一抛, 一扔的意思, 即可以理解为响应用户有速度的滑动屏幕事件。

简单的实现屏幕滑动切换Activity的代码,在这个代码中:

  • 将左右切换Activity的实现,抽取到BaseActivity来完成
  • 若有Activity想要进行切换,只需继承这个BaseActivity,并复写showNextPage 与showPreviousPage方法
  • 前提是可以响应 next 与 previous 按钮鼠标点击事件
  • 一般有: rawX : 基于整个屏幕的X左边 X:基于控件的X坐标

如下:

    public abstract class BaseActivity extends Activity {

        private GestureDetector mDectector;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);             
            mDectector = new GestureDetector(this, new SimpleOnGestureListener() {

                /**
                 * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
                 */
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2,
                        float velocityX, float velocityY) {

                        // 判断纵向滑动幅度是否过大, 过大的话不允许切换界面
                        if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) {
                            Toast.makeText(MobileGuardBaseActivity.this, "不能这样划哦!",
                                    Toast.LENGTH_SHORT).show();
                            return true;
                        }

                        // 判断滑动是否过慢
                        if (Math.abs(velocityX) < 100) {
                            Toast.makeText(MobileGuardBaseActivity.this, "滑动的太慢了!",
                                    Toast.LENGTH_SHORT).show();
                            return true;
                        }

                        // 向右划,上一页
                        if (e2.getRawX() - e1.getRawX() > 200) {
                            showPreviousPage();
                            return true;
                        }

                        // 向左划, 下一页
                        if (e1.getRawX() - e2.getRawX() > 200) {
                            showNextPage();
                            return true;
                        }

                        return super.onFling(e1, e2, velocityX, velocityY);
                    }
                });
            }

            /**
             * 展示下一页, 子类必须实现
             */
            public abstract void showNextPage();

            /**
             * 展示上一页, 子类必须实现
             */
            public abstract void showPreviousPage();

            // 点击下一页按钮
            public void next(View view) {
                showNextPage();
            }

            // 点击上一页按钮
            public void previous(View view) {
                showPreviousPage();
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                mDectector.onTouchEvent(event);// 委托手势识别器处理触摸事件
                return super.onTouchEvent(event);
            }

    }

获取手机联系人

这件事的实现当然是依赖的内容提供者。

  1. 为了获取到联系人,共涉及到2张表(可以这么说),他们的内容提供者的Uri为:

    • content://com.android.contacts/raw_contacts (主要从这个表获取contact_id)
    • content://com.android.contacts/data (实际是view_data视图的URI)
  2. 获取代码:

    Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");  //查的不是data表, 查的实际上是view_data视图
        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();

        //raw_contacts表中获取联系人信息的ID
        Cursor queryRawC = getContentResolver().query(rawContactsUri, new String[]{"contact_id"}, null, null, null);

        while( queryRawC.moveToNext() ){
            String contactId = queryRawC.getString(0);
            Cursor dataCursor = getContentResolver().query(dataUri, new String[]{"data1", "mimetype"}, "contact_id = ?", new String[]{contactId}, null);
            if (dataCursor != null) {
                HashMap<String, String> map = new HashMap<String, String>();
                while (dataCursor.moveToNext()) {
                    String data1 = dataCursor.getString(0);
                    String mimetype = dataCursor.getString(1);
                    if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
                        map.put("phone", data1);
                    } else if ("vnd.android.cursor.item/name".equals(mimetype)) {
                        map.put("name", data1);
                    }
                }

                list.add(map);
                dataCursor.close();
            }
        }

        queryRawC.close();

应注意:

-  我们没有去查mimetype相关的表, 而是根据类型直接去判断的
-  ArrayList<HashMap<String, String>>可以直接用ListView的SimpleAdapter处理

SIM卡信息

可以使用TelephonyManager来获取, 例如:

    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String simSerialNumber = tm.getSimSerialNumber();// 获取sim卡序列号

零碎

  • Point1

    • 当我们想让用户输入号码时, 可以直接弹出号码输入框,而不是整个键盘: inputType=”phone”
  • Point2

    • 当从一个Activity返回时, 结果码有:
      • Activity.RESULT_OK:我们应手动设置这个; Activity.RESULT_CANCEL:当用户直接点解返回键是,返回的就是这个resultCode。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android进阶之读取手机联系人显示listview并点击拨号(CursorAdapter)

一、CursorAdapter介绍1、继承于BaseAdapter是个虚类,它为cursor和ListView提供了连接的桥梁。 如:public abstract class CursorAdap...

android手机屏幕滑动

  • 2016年06月23日 11:25
  • 399KB
  • 下载

[android] 手机卫士手势滑动切换屏幕

定义手势识别器 获取手势识别器GestureDetector对象,通过new GestureDetector(context,listener),参数:上下文,监听器 匿名内部类实现简单手...

android 获取手机联系人

  • 2017年09月05日 08:41
  • 642KB
  • 下载

Android 绘图进阶:Canvas绘制联系人侧滑列表(drawText+监听者模式)

上面展示的是效果图,我们平时使用的通过点击字母就能找到相关字母的联系人,这就是我们想要达到的效果。思路与步骤  根据我们想要实现的效果,我们先要理一理思路,所有的编程都是这样,有了清晰的思路才能确定每...

Android获取手机联系人及归属地

  • 2016年03月15日 13:48
  • 2.13MB
  • 下载

android获取手机联系人

  • 2016年12月27日 09:26
  • 1.7MB
  • 下载

Android简单获取手机联系人姓名电话号码

1.手机上联系人数据库文件(contact2.db)存放目录:/data/data/com.android.providers.contacts 2.联系人源码位于工程目录:packages\app...

Android---获取手机联系人

  • 2016年03月12日 23:08
  • 1.64MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-屏幕滑动和获取手机联系人
举报原因:
原因补充:

(最多只允许输入30个字)