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

模仿手机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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值