您的位置:首页 > 运维架构

利用PopWindow自定义弹出框

2012-10-17 11:24 309 查看
mainActivity:

[java] view
plaincopy

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:

[java] view
plaincopy

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:

[java] view
plaincopy

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_GR***ITY, 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:

[java] view
plaincopy

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_GR***ITY, xPos, yPos);

}



public void dismiss() {

window.dismiss();

}

}

main.xml

[html] view
plaincopy

<?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

[html] view
plaincopy

<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

[html] view
plaincopy

<?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

原文地址:http://blog.csdn.net/niejing654092427/article/details/7708547
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: