package com.diandi.demo.widget.dialog; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import com.diandi.demo.R; import com.diandi.demo.util.ScreenUtils; import java.util.ArrayList; /** * ******************************************************************************* * ********* Author : klob(kloblic@gmail.com) . * ********* Date : 2014-11-29 . * ********* Time : 11:46 . * ********* Project name : Diandi1.18 . * ********* Version : 1.0 * ********* Copyright @ 2014, klob, All Rights Reserved * ******************************************************************************* */ public class TitlePop extends PopupWindow { //列表弹窗间隔 private final int LIST_PADDING = 10; //坐标位置 private final int[] mLocation = new int[2]; private Context mContext; //实例化一个矩形 private Rect mRect = new Rect(); //屏幕的宽度和高度 private int mScreenWidth, mScreenHeight; //判断弹窗是否需要添加或更新列表子项 private boolean mIsDirty; //位置不再中心 private int mPopGravity = Gravity.NO_GRAVITY; //定义列表对象 private ListView mListView; //定义弹窗列表子项 private ArrayList<ActionItem> mActionItems = new ArrayList<ActionItem>(); //列表子项监听 private OnItemOnClickListener mOnItemClickListener; public TitlePop(Context context) { this(context, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } @SuppressWarnings("deprecation") public TitlePop(Context context, int width, int height) { this.mContext = context; //设置可以获得焦点 setFocusable(true); //设置窗内可点击 setTouchable(true); //设置窗外可点击 setOutsideTouchable(true); //获取屏幕宽度和高度 mScreenWidth = ScreenUtils.getScreenWidth(mContext); mScreenHeight = ScreenUtils.getScreenHeight(mContext); //设置弹窗宽度和高度 setWidth(width); setHeight(height); setBackgroundDrawable(new BitmapDrawable()); setContentView(LayoutInflater.from(mContext).inflate(R.layout.title_popup, null)); initUI(); } private void initUI() { mListView = (ListView) getContentView().findViewById(R.id.title_list); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { dismiss(); if (mOnItemClickListener != null) mOnItemClickListener.onItemClick(mActionItems.get(i), i); } }); this.setAnimationStyle(R.style.AnimationPreview); } /** * 显示弹窗列表界面 */ public void show(View view) { // 获得点击屏幕的位置坐标 view.getLocationOnScreen(mLocation); // 设置矩形的大小 mRect.set(mLocation[0], mLocation[1], mLocation[0] + view.getWidth(), mLocation[1] + view.getHeight()); // 判断是否需要添加或更新列表子类项 if (mIsDirty) { populateActions(); } // 显示弹窗的位置 showAtLocation(view, mPopGravity, mScreenWidth - LIST_PADDING - (getWidth() / 2), mRect.bottom); } /** * 设置弹窗列表子项 */ private void populateActions() { mIsDirty = false; // 设置列表的适配器 mListView.setAdapter(new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView = null; if (convertView == null) { textView = new TextView(mContext); textView.setTextColor(mContext.getResources().getColor( android.R.color.white)); textView.setTextSize(14); // 设置文本居中 textView.setGravity(Gravity.CENTER); // 设置文本域的范围 textView.setPadding(0, 10, 0, 10); // 设置文本在一行内显示(不换行) textView.setSingleLine(true); } else { textView = (TextView) convertView; } ActionItem item = mActionItems.get(position); // 设置文本文字 textView.setText(item.mTitle); // 设置文字与图标的间隔 textView.setCompoundDrawablePadding(10); // 设置在文字的左边放一个图标 textView.setCompoundDrawablesWithIntrinsicBounds( item.mDrawable, null, null, null); return textView; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return mActionItems.get(position); } @Override public int getCount() { return mActionItems.size(); } }); } /** * 添加子类项 */ public void addAction(ActionItem action) { if (action != null) { mActionItems.add(action); mIsDirty = true; } } /** * 清除子类项 */ public void cleanAction() { if (mActionItems.isEmpty()) { mActionItems.clear(); mIsDirty = true; } } /** * 根据位置得到子类项 */ public ActionItem getAction(int position) { if (position < 0 || position > mActionItems.size()) return null; return mActionItems.get(position); } /** * 设置监听事件 */ public void setItemOnClickListener( OnItemOnClickListener onItemOnClickListener) { this.mOnItemClickListener = onItemOnClickListener; } public static interface OnItemOnClickListener { public void onItemClick(ActionItem item, int position); } }