Android仿QQ聊天记录待定与删除功能效果

Android 轻松实现仿QQ消息下拉刷新 (本文讲解了在Android中实现列表下拉刷新的动态效果的过程,文末附有源码。) 看完本文,您可以学到: 1.下拉刷新的实现原理 2.自定义Android控件,重写其ListView 3.ScrollListener滚动监听 4.Adapter适配器的使用 话不多说,先来看看效果图: 接下来我们一步一步地实现以上的效果。 一、 阅读详情
模仿手机qq,历史聊天记录长按会弹出待定和删除按钮的效果。
qq效果图    代码实现的效果图

 


首先,看到这个效果,想一下实现的思路:弹出的待办和删除按钮,是通过dialog实现的。那么这个dialog就要能完成几个效果,第一:自定义界面,第二:控制dialog的显示位置,第三:点击dialog区域之外的地方,dialog要消失,第四:dialog显示的时候,activity不要变暗。
下面就一步一步解决问题:

1,自定义dialog

  1. package com.example.listitemdeletedemo;  
  2.   
  3. import android.app.Dialog;  
  4. import android.content.Context;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.TextView;  
  10.   
  11. /** 
  12. * @文件名称: MyDialog.java 
  13. * @功能描述: 自定义dialog 
  14. * @版本信息: Copyright (c)2014 
  15. * @开发人员: vincent 
  16. * @版本日志: 1.0 
  17. * @创建时间: 2014年3月18日 下午1:45:38 
  18. */  
  19. public class MyDialog extends Dialog implements OnClickListener {  
  20.         private TextView leftTextView, rightTextView;  
  21.         private IDialogOnclickInterface dialogOnclickInterface;  
  22.         private Context context;  
  23.   
  24.         public MyDialog(Context context, int theme) {  
  25.                 super(context, theme);  
  26.                 this.context = context;  
  27.                 // TODO Auto-generated constructor stub  
  28.         }  
  29.   
  30.         @Override  
  31.         protected void onCreate(Bundle savedInstanceState) {  
  32.                 // TODO Auto-generated method stub  
  33.                 super.onCreate(savedInstanceState);  
  34.                 setContentView(R.layout.layout_dialog);  
  35.   
  36.                 leftTextView = (TextView) findViewById(R.id.textview_one);  
  37.                 rightTextView = (TextView) findViewById(R.id.textview_two);  
  38.                 leftTextView.setOnClickListener(this);  
  39.                 rightTextView.setOnClickListener(this);  
  40.         }  
  41.   
  42.         @Override  
  43.         public void onClick(View v) {  
  44.                 // TODO Auto-generated method stub  
  45.                 dialogOnclickInterface = (IDialogOnclickInterface) context;  
  46.                 switch (v.getId()) {  
  47.                 case R.id.textview_one:  
  48.                         dialogOnclickInterface.leftOnclick();  
  49.                         break;  
  50.                 case R.id.textview_two:  
  51.                         dialogOnclickInterface.rightOnclick();  
  52.                         break;  
  53.                 default:  
  54.                         break;  
  55.                 }  
  56.         }  
  57.   
  58.         public interface IDialogOnclickInterface {  
  59.                 void leftOnclick();  
  60.   
  61.                 void rightOnclick();  
  62.         }  
  63. }  
package com.example.listitemdeletedemo;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

/**
* @文件名称: MyDialog.java
* @功能描述: 自定义dialog
* @版本信息: Copyright (c)2014
* @开发人员: vincent
* @版本日志: 1.0
* @创建时间: 2014年3月18日 下午1:45:38
*/
public class MyDialog extends Dialog implements OnClickListener {
        private TextView leftTextView, rightTextView;
        private IDialogOnclickInterface dialogOnclickInterface;
        private Context context;

        public MyDialog(Context context, int theme) {
                super(context, theme);
                this.context = context;
                // TODO Auto-generated constructor stub
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.layout_dialog);

                leftTextView = (TextView) findViewById(R.id.textview_one);
                rightTextView = (TextView) findViewById(R.id.textview_two);
                leftTextView.setOnClickListener(this);
                rightTextView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
                // TODO Auto-generated method stub
                dialogOnclickInterface = (IDialogOnclickInterface) context;
                switch (v.getId()) {
                case R.id.textview_one:
                        dialogOnclickInterface.leftOnclick();
                        break;
                case R.id.textview_two:
                        dialogOnclickInterface.rightOnclick();
                        break;
                default:
                        break;
                }
        }

        public interface IDialogOnclickInterface {
                void leftOnclick();

                void rightOnclick();
        }
}

2,控制dialog显示位置
     长按listview的item时。获取当前item在屏幕中的绝对位置,取其中的y值,即高度。根据listview item的height以及屏幕的高度,计算得到dialog的垂直位置,水平位置就直接居中就OK了

  1. int[] location = new int[2];  
  2.                                 // 获取当前view在屏幕中的绝对位置  
  3.                                 // ,location[0]表示view的x坐标值,location[1]表示view的坐标值  
  4.                                 view.getLocationOnScreen(location);  
  5.                                 view.setBackgroundColor(getResources().getColor(R.color.blue));  
  6.                                 currentItemView = view;  
  7.                                 longClickPosition = position;  
  8.                                 DisplayMetrics displayMetrics = new DisplayMetrics();  
  9.                                 Display display = MainActivity.this.getWindowManager().getDefaultDisplay();  
  10.                                 display.getMetrics(displayMetrics);  
  11.                                 WindowManager.LayoutParams params = myDialog.getWindow().getAttributes();  
  12.                                 params.gravity = Gravity.BOTTOM;  
  13.                                 params.y =display.getHeight() -  location[1];  
  14.                                 myDialog.getWindow().setAttributes(params);  
  15.                                 myDialog.setCanceledOnTouchOutside(true); //点击dialog区域之外的地方,dialog消失  
  16.                                 myDialog.show();  
int[] location = new int[2];
                                // 获取当前view在屏幕中的绝对位置
                                // ,location[0]表示view的x坐标值,location[1]表示view的坐标值
                                view.getLocationOnScreen(location);
                                view.setBackgroundColor(getResources().getColor(R.color.blue));
                                currentItemView = view;
                                longClickPosition = position;
                                DisplayMetrics displayMetrics = new DisplayMetrics();
                                Display display = MainActivity.this.getWindowManager().getDefaultDisplay();
                                display.getMetrics(displayMetrics);
                                WindowManager.LayoutParams params = myDialog.getWindow().getAttributes();
                                params.gravity = Gravity.BOTTOM;
                                params.y =display.getHeight() -  location[1];
                                myDialog.getWindow().setAttributes(params);
                                myDialog.setCanceledOnTouchOutside(true); //点击dialog区域之外的地方,dialog消失
                                myDialog.show();

3,dialog显示的时候,activity不变暗,这个在dialog的style中设置

  1. <style name=“MyDialogStyle” parent=“@android:Theme.Dialog”>  
  2.         <item name=“android:windowFrame”>@null</item>  
  3.         <item name=“android:windowNoTitle”>true</item>  
  4.         <item name=“android:windowBackground”>@drawable/white</item>  
  5.         <item name=“android:windowIsFloating”>true</item>  
  6.         <item name=“android:windowContentOverlay”>@null</item>  
  7.         <item name=“android:backgroundDimEnabled”>false</item>   
  8.     </style>  
<style name="MyDialogStyle" parent="@android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@drawable/white</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">false</item> 
    </style>

ListItemDeleteDemo.zip


原文:http://www.eoeandroid.com/thread-326918-1-1.html


安卓-QQ-课程设计 ​ 1. 前言:2017年学了一个月Android后写的小项目,文档近日才完成,项目与文档均为原创,发布出来以此怀念一下几年前。由于2017年写的项目,代码与技术均落后,但能提供下编写类似项目一点思路以及课程设计文档的编写。 2.项目链接:Android-QQ-课程设计(源码+论文)-Android文档类资源-优快云下载 3. 项目视频:Android-QQ 仿QQApp_哔哩哔哩_bilibili 4. 项目功能简述 Web服务器采用struts2、hibernate、spring框架,使用My 阅读详情

相关推荐

android--ListView实现聊天记录

android--ListView实现聊天记录

Androidstudio开发,实现qq好友列表

文章目录1. 项目涉及到的技术点2. 代码实现过程3. 运行效果截图 1. 项目涉及到的技术点 ListView列表控件的使用 ListView+adapter实现列表 SQLite实现用户登录,注册数据存储 2. 代码实现过程 注册页面activity_register.xml布局 <?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="

商城app+新闻app+备忘录记事本app视频教程在某站【浩宇软件开发】 5875

仿微信客服聊天界面(已实现聊天记录本地数据库保存)

仿微信客服聊天界面(已实现聊天记录本地数据库保存),同时也写好了网络传输,以提供注释,方便你的使用。

第67篇 Android Studio实现聊天记录界面-ListView多形式界面

第67篇 Android Studio实现聊天记录界面-ListView多形式界面1.需求2.文件目录3.主界面布局4.左边信息界面布局5.右边信息界面布局6.数据类Data7.MyAdapter类8.主活动类9.效果10.代码10.1.主界面10.2.左边布局10.3.右边布局10.4.Data类10.5.MyAdapter类10.6.活动类 1.需求 这是QQ的聊天界面 这呢其实用ListView多形式界面就可以实现,可以看出: 一个是图片在左边,文字在右边, 而另一个是图片在右边,文字在左边, 而且

weixin_49188222的博客 7956

Android 开发聊天工具 模仿QQ,实现网络即时聊天功能。

Android 开发聊天工具 模仿QQ,实现网络即时聊天功能。

Android仿qq消息列表

仿qq消息列表的一个demo;献给喜欢Android的朋友们

Android仿微信聊天记录“图片及视频”默认最新图片从底部显示(时间排序升序)

Android仿微信聊天记录“图片及视频”默认最新图片从底部显示 1、设置recycler的LinearLayoutManager LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setStackFromEnd(true); RecyclerView.setLayoutManager(linearLayoutManager); 2、 这个最为关键是启到从底部加载的

weixin_50244933的博客 1502

Android 实现用户列表信息滑动删除功能和选择删除功能

在项目开发过程中,常常需要对用户列表的信息进行删除的操作。Android中常用的删除操作方式有两种 ,一种就是类似微信的滑动出现删除按钮方式,还有一种是通过CheckBox进行选择,然后通过按钮进行删除的方式。本来的实例集成上述的两种操作方式来实现用户列表删除的效果。 设计思路:在适配器类MyAdapter一个滑动删除按钮显示或隐藏的Map,一个用于CheckBox是否选中的Map和一个与MainAcitivyt进行数据交互的接口ContentsDeleteListener,同时该接口包含两个方法,contentsDeleteSelect(int position, boolean isChecked)方法用于将选中或取消内容从选中List中加入或删除,contentDelete(int position)用于删除List中指定位置的列项。滑动的效果主要是通过当滑动的距离大于40时,显示滑动删除按钮,再执行删除操作时,将其他所有设置不可见,并设置CheckBox为不选中状态。

Android仿qq聊天记录待定与删除功能效果

模仿手机qq,历史聊天记录长按会弹出待定和删除按钮的效果。qq效果图代码实现的效果图首先,看到这个效果,想一下实现的思路:弹出的待办和删除按钮,是通过dialog实现的。那么这个dialog就要能完成几个效果,第一:自定义界面,第二:控制dialog的显示位置,第三:点击dialog区域之外的地方,dialog要消失,第四:dialog显示的时候...

weixin_34268169的博客 230

抽象代数学习笔记(抽象代数的历史、运算)

1. 抽象代数历史 对于五次及以上的代数方程是否存在根式解这个问题,欧拉、拉格朗日、高斯等数学家都没得到答案,但是他们得出五次及以上的代数方程组不存在根式解的结论。19世纪初,阿贝尔提出五次及以上的代数方程不存在根式解,并找出一类特殊的五次及以上的代数方程可以用根式解表示出来。另外一个年轻的数学家伽罗华...

huangzhpei的博客 3668

进芯AVP28335烧录避坑全记录:CCS、Uniflash、C2Prog、SDFlash四大工具配置详解

本文详细解析了进芯AVP28335芯片在烧录过程中遇到的常见问题及解决方案,涵盖CCS、Uniflash、C2Prog和SDFlash四大工具的配置要点。针对国产器件AVP28335的特殊需求,提供了从开发环境准备到烧录验证的全流程指南,帮助开发者高效完成程序烧录,避免常见陷阱。

weixin_30836759的博客 590

Android仿qq聊天记录长按删除功能效果

最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没有必要这么麻烦,于是我用Popupwindow实现了一个,有需要的朋友可以参考一下。 1.效果图如下(长按列表弹窗,消息详细信息长按弹窗) 2.对源码进行说明。 ...

dengshuo4753的博客 402

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5714

怎么恢复QQ删除的聊天记录?专业数据恢复技巧大公开!

通过本文大家都知道了QQ聊天记录删除后并非无法挽回,我们可以通过QQ自带的备份功能、电脑QQ备份恢复、和使用专业的数据恢复软件等方法,我们有很大成功概率可以找回这些珍贵的数据。如果您使用的是苹果手机,金舟苹果手机恢复大师是一款非常实用的工具,支持恢复手机视频、图片、微信和QQ聊天记录等,软件界面简洁友好,适合新手使用。第三步、选择需要恢复的数据,这里选择APP数据中的【QQ】数据。QQ聊天记录删除后是可以恢复的,但恢复的成功率取决于多种因素,如删除后是否进行了新的数据写入、是否开启了备份功能等。

callmysolt的博客 3338

Gerrit 使用操作手册

Gerrit是一种免费、开源的代码审查工具,使用网页交互页面。这个软件的名称来自于荷兰设计师师赫里特·里特费尔德(GerritRietveld),作者为Google公司的ShawnPearce。它使用Git作为底层版本控制系统,相比于其他的代码管理工具,Gerrit明显的特色是代码审核。利用网页浏览器,同一个团队的软件程序员,可以相互审核(Review)彼此修改后的程序代码,然后决定是继续提交还是取消提交。...

九离的博客 1万+

CESM笔记——CESM1.0-CESM1.2.2-CESM2.1.3三个版本模式工作流对比

最近测试了CESM1.0,CESM1.2.2和CESM2.1.3三个版本,不同版本在workflow上有一些区别,来做点笔记。 CESM1.0 测试compset:B_2000,F_2000 workflow: 1. create_newcase -case ~/CESM/cesm1_0/script/B_2000 -compset B_2000 -res f19_g16 -mach tianhe 2. cd B_2000 (optional) env_mach_pes.xml ##修改核数,

砍柴姑娘Jourosy的博客 4944

安卓开发-最简单快速的仿微信聊天实现-附赠微信原生表情,QQ原生表情

前言;正常实现聊天功能想必大家都使用三方的Sdk比如环信融云集成的,但是聊天记录的保存只能有三天,想增加保存时长就需要花钱,so 我只好自己想办法实现了,这个demo是类似于留言板,并非即时通讯!只实现了表情文字图文混排,可以通过手动刷新实现即时通讯ok废话少说,先看效果图; 大体思路: 1.先从布局开始,聊天界面就是多条目的listview,左右各算一种类型,这样正常语音,文字,图文

panghaha12138的博客 1万+

基于OpenCV和Dlib的头部姿态估计详细教程

本文详细介绍了基于OpenCV和Dlib的头部姿态估计方法。通过分析2D人脸特征点与3D头部模型的对应关系,利用PnP(Perspective-n-Point)算法求解头部在三维空间中的姿态。文章首先阐述了坐标系统转换原理,包括世界坐标系、相机坐标系和图像坐标系的转换关系,随后深入讲解了PnP问题的数学表述及求解步骤,并提供了使用Dlib检测68个面部特征点的代码示例。最后介绍了3D通用头部模型的构建方法,包括6点和14点模型的选择,为计算机视觉中的头部姿态估计提供了完整的技术实现方案。

FJN110的博客 338

qq手机电脑消息同步_别人的微信聊天记录消息怎么同步接收到自己手机

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注:本文转载自网络,不代表本平台立场,仅供读者参考,著作权属归原创者所有。我们分享此文出于传播更多资讯之目的。如有侵权,请在后台留言联系我们进行删除,谢谢! ...

weixin_39627144的博客 1393

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 80

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android 自定义view(侧拉删除)

开心一刻: A:嘿 //是什么意思啊? B:嘿. A:呃我问你//是什么意思? B:问吧. A:我刚才不是问了么? B:啊? A:你再看看记录… B:看完了. A:……所以//是啥? B:所以什么? A:你存心耍我呢吧? B:没有啊你想问什么? …… 不断循环之后,A一气之下和B绝交,自己苦学程序。 N年之后,A终于修成正果,回想起B ,又把聊天记录翻出来看,这时,...

wk_先森的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: matlab:Excel数据导入C程序中
下一篇: Android 打造可下拉的EditText--DropEditText
潘建成
博客等级 码龄12年 139粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值