android listview仿iphone通讯录ios 3dTouch_android 自定义通讯录(仿ios反弹效果+模糊搜索+拉伸导航条_cuckoochun的博客-程序员宅基地

技术标签: android 开发  android 3dTouch效果  

接上篇android listview仿ios 3dTouch效果,对代码进行整合进类似ios通讯录里面,效果图如下:

                    、


效果如上,在上篇的内容后面跳出电话信息。

popmenu布局文件代码

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
    >

    <LinearLayout
        android:id="@+id/pop_name_ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/pop_name_bg"
        android:paddingLeft="10dp"
        android:gravity="center_vertical"
        android:layout_marginLeft="5dp"
        >
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/pop_photo"
            />
            <TextView
                android:id="@+id/pop_photo_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:textColor="#FFFFFF"
                android:textSize="30sp"
                />
        </RelativeLayout>
        <TextView
            android:id="@+id/pop_name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:text="@string/imei_panel_close"
            android:layout_marginLeft="10dp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:layout_marginLeft="2dp"
        >

        <LinearLayout
            android:id="@+id/pop_mms_ll"
            android:layout_width="match_parent"
            android:layout_height="110px"
            android:background="@drawable/pop_up_bg"
            android:paddingLeft="20dp"
            android:gravity="center_vertical"
            android:layout_marginTop="10dp"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/pop_mms_unpress"
                />

            <TextView
                android:layout_width="700px"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:text="@string/pop_mms"
                android:layout_marginLeft="10dp"
                />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/pop_call_ll"
            android:layout_width="match_parent"
            android:layout_height="110px"
            android:background="@drawable/pop_down_bg"
            android:paddingLeft="20dp"
            android:gravity="center_vertical"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/pop_phone_unpress"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:text="@string/pop_call"
                android:layout_marginLeft="10dp"
                />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
在源代码中,通讯录的点击事件的页面是在Fragment里面的,这时候不能将高斯模糊的图片放在该布局上,要放到对应的activity,点击的时候利用回调处理popmenu的弹出。要注意的是弹出的和高斯模糊图片颜色过于接近,肉眼分别不出来效果,在最上面的高斯模糊图片上面再加一个带透明灰色的全屏view。

AllContactsFragment.java

//begin add by csc
        getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                 uri = (Uri) view.getTag();
               if(uri!=null) {
                   count = 0;
                   sampleImg = DialerUtils.captureScreen(getActivity());
                   DialtactsActivity.imageUp.setVisibility(View.VISIBLE);
                   DialtactsActivity.imageDown.setVisibility(View.VISIBLE);
                   DialtactsActivity.imageUp.setImageBitmap(sampleImg);
                   gaussianBlurImg = DialerUtils.blur(getActivity(),sampleImg, 25f);// 高斯模糊图片
                   DialtactsActivity.imageDown.setImageBitmap(gaussianBlurImg);
                   DialtactsActivity.imageUp.setImageAlpha(255);
//                HashMap item = (HashMap)getListView().getItemAtPosition(position);
//                String section =String.valueOf(item.get("name").toString());//get每一行的数据的名字
                   nameOrNum = DialerUtils.getPhoneContacts(getActivity(),uri)[0] == null ? DialerUtils.getPhoneContacts(getActivity(),uri)[1] : DialerUtils.getPhoneContacts(getActivity(),uri)[0];
                   phoneNum = DialerUtils.getPhoneContacts(getActivity(),uri)[1];
                   DialtactsActivity.testTv.setText(nameOrNum);
                   int[] location = new int[2];
                   getListView().getChildAt(position - getListView().getFirstVisiblePosition()).getLocationOnScreen(location);
                   lp.setMargins(0, location[1], 0, 0);
                   DialtactsActivity.testTv.setLayoutParams(lp);
                   DialtactsActivity.viewShadow.setVisibility(View.VISIBLE);
                   DialtactsActivity.testTv.setVisibility(View.VISIBLE);
                   is3DTouch = true;
               }
                return false;
            }
        });
        getListView().setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (is3DTouch) {
                            if (count < 255)
                                count = count + 8;
                            int alpha = 255 - count;
                            if (alpha < 0)
                                alpha = 0;
                            DialtactsActivity.imageUp.setImageAlpha(alpha);

                            if(alpha == 0){
                                myListener.showPopupWindow(DialtactsActivity.testTv,nameOrNum,phoneNum,uri);
                                DialtactsActivity.testTv.setVisibility(View.GONE);
                                return false;
                            }
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return false;
            }
        });
		
		// end add by csc

myListener.showPopupWindow(DialtactsActivity.testTv,nameOrNum,phoneNum,uri);
当第一个出来的item透明度为不透明的时候,回调showPopupWindow(View view,String popName,String phoneNum,Uri uri)方法,处理popmenu的弹出

public interface MyListener
    {
        public void showPopupWindow(View view,String popName,String phoneNum,Uri uri);
    }
该方法在DialtactActivity.java中实现:

/*begin add by csc for 3d touch*/
    public void showPopupWindow(View view,String popName, String phoneNum,Uri uri) {
        final Uri uris = uri;
        final String phoneNumber =phoneNum;
        popNameTv.setText(popName);
        popPhotoTv.setText(popName.subSequence(0, 1));
        viewShadow.setVisibility(View.VISIBLE);

        popNameLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (CompatUtils.hasPrioritizedMimeType()) {
                    ContactsContract.QuickContact.showQuickContact(getApplicationContext(), v, uris, null,
                            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                } else {
                    ContactsContract.QuickContact.showQuickContact(getApplicationContext(), v, uris, ContactsContract.QuickContact.MODE_LARGE,
                            null);
                }
                popupWindow.dismiss();
            }
        });
        popMmsLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(phoneNumber!=null) {
                    Uri smsToUri = Uri.parse("smsto:" + phoneNumber);

                    Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);

                    startActivity(intent);
                    popupWindow.dismiss();

                }
            }
        });

        popCallLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(phoneNumber!=null) {

                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
                    startActivity(intent);
                    popupWindow.dismiss();
                }
            }
        });

        popupWindow.setTouchable(true);
        popupWindow.showAsDropDown(view);


    }
    /*end add by csc for 3d touch*/




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cuckoochun/article/details/76735908

智能推荐

java的concurrent用法详解-程序员宅基地

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的

技术项目 - Linux网卡中断使单个CPU过载_网络中断 单个cpu瓶颈-程序员宅基地

Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核。然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题。我们已经在拥有一个或多个饱和1Gbps网卡的高性能系统上发现过这个问题,近来在有许多小包并发(大约10000packets/second)超载的虚拟机上也发现了这个问题。原因很清楚:在最简单的模式中,内核通过硬件中断的方式来处理每个来自于网卡的包。但_网络中断 单个cpu瓶颈

深入理解计算机系统:1.6 存储设备的层级(Storage Devices Form a Hierarchy)-程序员宅基地

1.6 存储设备的层级一般的情况,会选择在处理器和大容量速度慢的存储设备之间增加一个小容量速度快的存储设备,事实上,在每一台计算机系统中存储设备的层级关系如图1.9所示。当我们从层级的顶端到底层,设备的容量会越来越大,速度越来越慢,价格越来越便宜。寄存器作为层级的顶端,也是第0级或L0.这里展示的是高速缓存的L1~L3,主存在第4层,本地硬盘在第5层,外设在第6层。存储设备分层的主要目的是高...

算法(17)-单链表-删除指定节点的值-C++-程序员宅基地

给定一个单链表head和一个值num,删除链表中值为num的值。比如1->2->3->4->5->null,num=3 删后即为:1->2->4->5.基本就一coding问题。思路:用容器将不等于num的节点收集起来再连起来。 提供两个版本:1.用vector ...

python的布尔类型_python布尔类型-程序员宅基地

布尔类型是Python的基础数据类型,布尔类型只有True和False两种值布尔类型的集中运算与运算只有两个布尔值都为 True 时,计算结果才为 True。或运算只要有一个布尔值为 True,计算结果就是 True。非运算把True变为False,或者把False变为True:这些运算有什么用呢?计算机程序是由无数的逻辑分支组成的,通过布尔运算,可以在计算机中实现条件判断,根据计算结果为True或者False,计算机可以自动执行不同的后续代码,..._python布尔类型

AcWing基础算法(二)_输入一个nn行mm列的整数矩阵,再输入qq个询问,每个询问包含四个整数x_1, y_1, x_2,_学算法的小码农的博客-程序员宅基地

AcWing基础算法(二)高精度整数加法题目给定两个正整数(不含前导 0),计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤1000001≤整数长度≤100000输入样例:1223输出样例:35思路既然题目给定的数字很长int存不了的话,那我们就改用数组存储。因为我们要用数组存储,所以我们没办法直接相加(要不然也不会是算法),那我们可以模拟我们人类的计算过程让计算机进行计算。实现既然是数组存储数据我们就要想清_输入一个nn行mm列的整数矩阵,再输入qq个询问,每个询问包含四个整数x_1, y_1, x_2,

随便推点

【Python】配置国内pip源-程序员宅基地

清华源:linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下: [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simplewindows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下...

输入一个角度的弧度值x,计算该角的余弦值_从键盘输入一个角度的弧度值x-程序员宅基地

#include #include main(){double x,s;printf("input value of x:");scanf("%lf",&x);s=cos(x);printf("cos(%lf)=%lf\n",x,s);}_从键盘输入一个角度的弧度值x

NumPy操作数组的方法_numpy 数组操作-程序员宅基地

改变数组结构返回的是原数组的一个新视图,而不是原数组的副本。函数返回数组中满足给定条件的元素和索引号,其结构为元组,元组的第k个元素对应符合条件的元素在数组k轴上的索引号。使用逻辑表达式查找(下面的代码演示了使用逻辑表达式查找符合条件的元素,返回结果是一个和原数组结构相同的布尔型数组,元素符合条件在布尔型数组中对应True,否则对应False)这里约定查找是返回数组中符合条件的元素的索引号,或返回和数组具有相同结构的布尔型数组,元素符合条件在布尔型数组中对应True,否则对应False。_numpy 数组操作

MySQL连接数Max_used_connections过多处理方法-程序员宅基地

一、问题描述 今天突然接到个问题,Mysql内存占用90%多,后来发现有问题就查找到Max_used_connections到达顶峰二、处理方法1.查询连接情况root@localhost > show processlist;…...1001 rows in set (0.00 sec)root@localhost > show variable..._max_used_connections

小程序表单校验uni-forms正确使用方式及避坑指南-程序员宅基地

解决小程序上使用uni-forms表单验证的问题,实现即时校验、自定义校验规则、异步校验,满足绝大部分表单校验!_uni-forms