利用Popupwindow自定义弹出框

来源:互联网 发布:国际象棋对下软件 编辑:程序博客网 时间:2024/05/22 23:32

效果图:

示例1:效果1

示例1:  效果2

 

 

示例1:源代码下载地址为:  http://download.csdn.net/detail/niejing654092427/4698359

 

 

示例2:   效果图:

 

 

 

 

 

 

 

 

 

mainActivity:

package com.cn.nj.quickaction;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.cn.nj.quickaction.util.quick.ActionItem;import com.cn.nj.quickaction.util.quick.QuickAction;public class QuickActionTestActivity extends Activity implements OnClickListener{private Button button01;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        button01 = (Button) findViewById(R.id.button1);        button01.setOnClickListener(this);    }@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button1:show(v);break;default:break;}}private void show(View v){final ActionItem first = new ActionItem();View sexView = v.findViewById(R.id.button1);final QuickAction qa = new QuickAction(sexView);first.setTitle("相机");first.setIcon(getResources().getDrawable(R.drawable.camera_icon_select));first.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {getdismiss(qa);}});final ActionItem second = new ActionItem();second.setTitle("文件");second.setIcon(getResources().getDrawable(R.drawable.album_icon_select));second.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {getdismiss(qa);}});qa.addActionItem(first);qa.addActionItem(second);qa.show();}private void getdismiss(QuickAction qa){qa.dismiss();}}


ActionItem:

package com.cn.nj.quickaction.util.quick;import android.graphics.drawable.Drawable;import android.view.View.OnClickListener;/** */public class ActionItem {private Drawable icon;private String title;private OnClickListener listener;/** * Constructor */public ActionItem() {}/** * Constructor *  * @param icon {@link Drawable} action icon */public ActionItem(Drawable icon) {this.icon = icon;}/** * Set action title *  * @param title action title */public void setTitle(String title) {this.title = title;}/** * Get action title *  * @return action title */public String getTitle() {return this.title;}/** * Set action icon *  * @param icon {@link Drawable} action icon */public void setIcon(Drawable icon) {this.icon = icon;}/** * Get action icon * @return  {@link Drawable} action icon */public Drawable getIcon() {return this.icon;}/** * Set on click listener *  * @param listener on click listener {@link View.OnClickListener} */public void setOnClickListener(OnClickListener listener) {this.listener = listener;}/** * Get on click listener *  * @return on click listener {@link View.OnClickListener} */public OnClickListener getListener() {return this.listener;}}


QuickAction:

package com.cn.nj.quickaction.util.quick;import java.util.ArrayList;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.TextView;import com.cn.nj.quickaction.R;/** */public class QuickAction extends CustomPopupWindow {private final View root;private final ImageView mArrowUp;private final ImageView mArrowDown;private final LayoutInflater inflater;private final Context context;protected static final int ANIM_GROW_FROM_LEFT = 1;protected static final int ANIM_GROW_FROM_RIGHT = 2;protected static final int ANIM_GROW_FROM_CENTER = 3;protected static final int ANIM_REFLECT = 4;protected static final int ANIM_AUTO = 5;private int animStyle;private ViewGroup mTrack;private ScrollView scroller;private ArrayList<ActionItem> actionList;/** * Constructor *  * @param anchor {@link View} on where the popup window should be displayed */public QuickAction(View anchor) {super(anchor);actionList= new ArrayList<ActionItem>();context= anchor.getContext();inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);root= (ViewGroup) inflater.inflate(R.layout.quick_popup, null);mArrowDown = (ImageView) root.findViewById(R.id.arrow_down);mArrowUp = (ImageView) root.findViewById(R.id.arrow_up);setContentView(root);    mTrack = (ViewGroup) root.findViewById(R.id.tracks);scroller= (ScrollView) root.findViewById(R.id.scroller);animStyle= ANIM_AUTO;}/** * Set animation style *  * @param animStyle animation style, default is set to ANIM_AUTO */public void setAnimStyle(int animStyle) {this.animStyle = animStyle;}/** * Add action item *  * @param action  {@link ActionItem} object */public void addActionItem(ActionItem action) {actionList.add(action); }/** * Show popup window. Popup is automatically positioned, on top or bottom of anchor view. *  */public void show () {preShow();int xPos, yPos;int[] location = new int[2];anchor.getLocationOnScreen(location);Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]                 + anchor.getHeight());createActionList();root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);int rootHeight = root.getMeasuredHeight();int rootWidth= root.getMeasuredWidth();int screenWidth = windowManager.getDefaultDisplay().getWidth();int screenHeight= windowManager.getDefaultDisplay().getHeight();//automatically get X coord of popup (top left)if ((anchorRect.left + rootWidth) > screenWidth) {xPos = anchorRect.left - (rootWidth-anchor.getWidth());} else {if (anchor.getWidth() > rootWidth) {xPos = anchorRect.centerX() - (rootWidth/2);} else {xPos = anchorRect.left;}}int dyTop= anchorRect.top;int dyBottom= screenHeight - anchorRect.bottom;boolean onTop= (dyTop > dyBottom) ? true : false;if (onTop) {if (rootHeight > dyTop) {yPos = 15;LayoutParams l = scroller.getLayoutParams();l.height= dyTop - anchor.getHeight();} else {yPos = anchorRect.top - rootHeight;}} else {yPos = anchorRect.bottom;if (rootHeight > dyBottom) { LayoutParams l = scroller.getLayoutParams();l.height= dyBottom;}}showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), anchorRect.centerX()-xPos);setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);}/** * Set animation style *  * @param screenWidth screen width * @param requestedX distance from left edge * @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor view *   and vice versa */private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;switch (animStyle) {case ANIM_GROW_FROM_LEFT:window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);break;case ANIM_GROW_FROM_RIGHT:window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);break;case ANIM_GROW_FROM_CENTER:window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);break;case ANIM_REFLECT:window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect : R.style.Animations_PopDownMenu_Reflect);break;case ANIM_AUTO:if (arrowPos <= screenWidth/4) {window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);} else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);} else {window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);}break;}}/** * Create action list */private void createActionList() {View view;String title;Drawable icon;OnClickListener listener;for (int i = 0; i < actionList.size(); i++) {title = actionList.get(i).getTitle();icon = actionList.get(i).getIcon();listener= actionList.get(i).getListener();view = getActionItem(title, icon, listener);view.setFocusable(true);view.setClickable(true); mTrack.addView(view);}}/** * Get action item {@link View} *  * @param title action item title * @param icon {@link Drawable} action item icon * @param listener {@link View.OnClickListener} action item listener * @return action item {@link View} */private View getActionItem(String title, Drawable icon, OnClickListener listener) {LinearLayout container= (LinearLayout) inflater.inflate(R.layout.action_item, null);ImageView img= (ImageView) container.findViewById(R.id.icon);TextView text= (TextView) container.findViewById(R.id.title);if (icon != null) {img.setImageDrawable(icon);}if (title != null) {text.setText(title);}if (listener != null) {container.setOnClickListener(listener);}return container;}/** * Show arrow *  * @param whichArrow arrow type resource id * @param requestedX distance from left screen */private void showArrow(int whichArrow, int requestedX) {        final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;        final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;        final int arrowWidth = mArrowUp.getMeasuredWidth();        showArrow.setVisibility(View.VISIBLE);                ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();               param.leftMargin = requestedX - arrowWidth / 2;                hideArrow.setVisibility(View.INVISIBLE);    }}


CustomPopupWindow:

package com.cn.nj.quickaction.util.quick;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.view.Gravity;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup.LayoutParams;import android.view.WindowManager;import android.widget.PopupWindow;import com.cn.nj.quickaction.R;public class CustomPopupWindow {protected final View anchor;protected final PopupWindow window;private View root;private Drawable background = null;protected final WindowManager windowManager;/** * Create a QuickAction *  * @param anchor *            the view that the QuickAction will be displaying 'from' */public CustomPopupWindow(View anchor) {this.anchor = anchor;this.window = new PopupWindow(anchor.getContext());// when a touch even happens outside of the window// make the window go awaywindow.setTouchInterceptor(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {CustomPopupWindow.this.window.dismiss();return true;}return false;}});windowManager = (WindowManager) anchor.getContext().getSystemService(Context.WINDOW_SERVICE);onCreate();}/** * Anything you want to have happen when created. Probably should create a view and setup the event listeners on * child views. */protected void onCreate() {}/** * In case there is stuff to do right before displaying. */protected void onShow() {}protected void preShow() {if (root == null) {throw new IllegalStateException("setContentView was not called with a view to display.");}onShow();if (background == null) {window.setBackgroundDrawable(new BitmapDrawable());} else {window.setBackgroundDrawable(background);}// if using PopupWindow#setBackgroundDrawable this is the only values of the width and hight that make it work// otherwise you need to set the background of the root viewgroup// and set the popupwindow background to an empty BitmapDrawablewindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);window.setTouchable(true);window.setFocusable(true);window.setOutsideTouchable(true);window.setContentView(root);}public void setBackgroundDrawable(Drawable background) {this.background = background;}/** * Sets the content view. Probably should be called from {@link onCreate} *  * @param root *            the view the popup will display */public void setContentView(View root) {this.root = root;window.setContentView(root);}/** * Will inflate and set the view from a resource id *  * @param layoutResID */public void setContentView(int layoutResID) {LayoutInflater inflator =(LayoutInflater) anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);setContentView(inflator.inflate(layoutResID, null));}/** * If you want to do anything when {@link dismiss} is called *  * @param listener */public void setOnDismissListener(PopupWindow.OnDismissListener listener) {window.setOnDismissListener(listener);}/** * Displays like a popdown menu from the anchor view */public void showDropDown() {showDropDown(0, 0);}/** * Displays like a popdown menu from the anchor view. *  * @param xOffset *            offset in X direction * @param yOffset *            offset in Y direction */public void showDropDown(int xOffset, int yOffset) {preShow();window.setAnimationStyle(R.style.Animations_PopDownMenu);window.showAsDropDown(anchor, xOffset, yOffset);}/** * Displays like a QuickAction from the anchor view. */public void showLikeQuickAction() {showLikeQuickAction(0, 0);}/** * Displays like a QuickAction from the anchor view. *  * @param xOffset *            offset in the X direction * @param yOffset *            offset in the Y direction */public void showLikeQuickAction(int xOffset, int yOffset) {preShow();window.setAnimationStyle(R.style.Animations_PopUpMenu_Center);int[] location = new int[2];anchor.getLocationOnScreen(location);Rect anchorRect =new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]+ anchor.getHeight());root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);int rootWidth = root.getMeasuredWidth();int rootHeight = root.getMeasuredHeight();int screenWidth = windowManager.getDefaultDisplay().getWidth();//int screenHeight = windowManager.getDefaultDisplay().getHeight();int xPos = ((screenWidth - rootWidth) / 2) + xOffset;int yPos = anchorRect.top - rootHeight + yOffset;// display on bottomif (rootHeight > anchorRect.top) {yPos = anchorRect.bottom + yOffset;window.setAnimationStyle(R.style.Animations_PopDownMenu_Center);}window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);}public void dismiss() {window.dismiss();}}


main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"    android:background="@drawable/bg">    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/btn" /></LinearLayout>


action_item.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" android:clickable="true"android:focusable="true"android:background="@drawable/action_item_btn">        <ImageViewandroid:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/><TextView android:id="@+id/title"android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical"android:paddingLeft="5dip"android:paddingRight="10dip"android:text="Chart"android:textColor="#fff"/>         </LinearLayout>         


quick_popup.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content">    <ScrollView android:id="@+id/scroller"android:layout_marginTop="16dip"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="@drawable/quick_popup"    android:fadingEdgeLength="5dip"    android:scrollbars="none">            <LinearLayout    android:id="@+id/tracks"    android:orientation="vertical"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="1"        android:padding="0dip"/>       </ScrollView >  <ImageView        android:id="@+id/arrow_up"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/quick_arrow_up" />         <ImageView        android:id="@+id/arrow_down"        android:layout_width="wrap_content"        android:layout_height="wrap_content"    android:layout_below="@id/scroller"      android:layout_marginTop="-4dip"        android:src="@drawable/quick_arrow_down" /></RelativeLayout>


代码下载地址为:http://download.csdn.net/detail/niejing654092427/4406118