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);
- }
- @Override
- public 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() {
- @Override
- public 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() {
- @Override
- public 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 away
- window.setTouchInterceptor(new OnTouchListener() {
- @Override
- public 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 BitmapDrawable
- window.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 bottom
- if (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
- <LinearLayout
- xmlns: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">
- <ImageView
- android: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.youkuaiyun.com/detail/niejing654092427/4406118
原文地址:http://blog.youkuaiyun.com/niejing654092427/article/details/7708547