Android仿qq聊天記錄待定與刪除功能效果
阿新 • • 發佈:2019-01-09
模仿手機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(); } }
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();
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>
原文:http://www.eoeandroid.com/thread-326918-1-1.html