Use popupwindow to customize the pop-up box

Source: Internet
Author: User

:

Example 1: effect 1

Example 1: Effect 2

 

 

Example 1: source code:

Http://download.csdn.net/detail/niejing654092427/4698359

 

 

Example 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 ("camera"); 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 ("file"); 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>

Code: http://download.csdn.net/detail/niejing654092427/4406118

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.