package com.piglet.widget; import android.content.Context; import android.graphics.Rect; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import com.piglet.R; /** * Popup window, shows action list as icon and text like the one in Gallery3D * app. * */ public class QuickAction extends QuickWindow { 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 LinearLayout mTrack; private ScrollView scroller; private final TextView title; /** * Constructor * * @param anchor * {@link View} on where the popup window should be displayed */ public QuickAction(View anchor) { super(anchor); context = anchor.getContext(); inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); root = inflater.inflate(R.layout.popup_title, null); // mArrowDown = (ImageView) root.findViewById(R.id.arrow_down); // mArrowUp = (ImageView) root.findViewById(R.id.arrow_up); title = (TextView)root.findViewById(R.id.title); setContentView(root); mTrack = (LinearLayout) root.findViewById(R.id.tracks); scroller = (ScrollView) root.findViewById(R.id.scroller); animStyle = ANIM_GROW_FROM_CENTER; } public void setTitle(String title){ this.title.setText(title); } public void setTitle(int titleId){ this.title.setText(titleId); } /** * Set animation style * * @param animStyle * animation style, default is set to ANIM_AUTO */ public void setAnimStyle(int animStyle) { this.animStyle = animStyle; } /** * 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()); root.setLayoutParams(new ViewGroup.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) int anchorXCenter = anchorRect.centerX(); int rootXCenter = rootWidth / 2; if (anchorXCenter - rootXCenter > 0 && anchorXCenter + rootXCenter < screenWidth) { xPos = anchorXCenter - rootXCenter; } else if ((anchorRect.left + rootWidth) > screenWidth) { xPos = anchorRect.left - (rootWidth - anchor.getWidth()) - 15; } else { if (anchor.getWidth() > rootWidth) { xPos = anchorRect.centerX() - (rootWidth / 2); } else { xPos = anchorRect.left + 15; } } 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 */ protected 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; } } /** * 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); } public void addItem(View item, LinearLayout.LayoutParams params) { mTrack.addView(item, params); } public void addItem(View item) { mTrack.addView(item); } public void onItemSelected(View selected) { if (mTrack != null) { for (int i = 0; i < mTrack.getChildCount(); i++) { View view = mTrack.getChildAt(i); if (view != null) { View item = view.findViewById(R.id.item); if (item != null && item instanceof TextView) { if (selected == item) { ((TextView) item).setTextColor(item .getContext() .getResources() .getColorStateList( R.color.popup_item_selector)); } else { ((TextView) item).setTextColor(item .getContext() .getResources() .getColorStateList( R.color.black_to_white_return)); } } } } } } public void onSnsItemSelected(TextView selected) { if (mTrack != null) { for (int i = 0; i < mTrack.getChildCount(); i++) { View view = mTrack.getChildAt(i); if (view != null) { View item = view.findViewById(R.id.item); if (item != null && item instanceof TextView) { if (selected == item) { ((TextView) item).setTextColor(item .getContext() .getResources() .getColorStateList( R.color.pt_deep_green)); } else { ((TextView) item).setTextColor(item .getContext() .getResources() .getColorStateList( R.color.gray_green_text_return)); } } } } } } }