模仿手机qq,历史聊天记录长按会弹出待定和删除按钮的效果。
qq效果图
代码实现的效果图
首先,看到这个效果,想一下实现的思路:弹出的待办和删除按钮,是通过dialog实现的。那么这个dialog就要能完成几个效果,第一:自定义界面,第二:控制dialog的显示位置,第三:点击dialog区域之外的地方,dialog要消失,第四:dialog显示的时候,activity不要变暗。
下面就一步一步解决问题:
2,控制dialog显示位置
长按listview的item时。获取当前item在屏幕中的绝对位置,取其中的y值,即高度。根据listview item的height以及屏幕的高度,计算得到dialog的垂直位置,水平位置就直接居中就OK了
3,dialog显示的时候,activity不变暗,这个在dialog的style中设置
qq效果图


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