自定义popupwindow(解决位置控制困惑)
一。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"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 1" /> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Button 2" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <Button android:id="@+id/btn3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="right" android:text="Button 3" /> </LinearLayout> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:text="Btn4" /> </LinearLayout>
二、ActionItem
package net.londatiga.android; import android.graphics.drawable.Drawable; import android.view.View.OnClickListener; /* * 弹出框选项 */ public class ActionItem { private Drawable icon; private String title; private OnClickListener listener; public ActionItem() {// 构造方法 } public ActionItem(Drawable icon) {// 构造方法 this.icon = icon; } public void setTitle(String title) {// 设置文字标题 this.title = title; } public String getTitle() {// 返回文字标题 return this.title; } public void setIcon(Drawable icon) {// 设置图标 this.icon = icon; } public Drawable getIcon() {// 返回图标 return this.icon; } public void setOnClickListener(OnClickListener listener) {// 设置监听 this.listener = listener; } public OnClickListener getListener() {// 返回监听 return this.listener; } }
三、
CustomPopupWindow
package net.londatiga.android; 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.View; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.PopupWindow; public class CustomPopupWindow { protected final View anchor; protected final PopupWindow window; private View root; private Drawable background = null; protected final WindowManager windowManager; public CustomPopupWindow(View anchor) { this.anchor = anchor; this.window = new PopupWindow(anchor.getContext()); window.setFocusable(true); window.setBackgroundDrawable(new BitmapDrawable()); windowManager = (WindowManager) anchor.getContext().getSystemService(Context.WINDOW_SERVICE); } protected void onShow() { } protected void preShow() { onShow(); window.setBackgroundDrawable(background); 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; } public void setContentView(View root) { this.root = root; window.setContentView(root); } public void setContentView(int layoutResID) { LayoutInflater inflator = (LayoutInflater) anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); setContentView(inflator.inflate(layoutResID, null)); } public void setOnDismissListener(PopupWindow.OnDismissListener listener) { window.setOnDismissListener(listener); } public void showDropDown() { showDropDown(0, 0); } public void showDropDown(int xOffset, int yOffset) { preShow(); window.setAnimationStyle(R.style.Animations_PopDownMenu); window.showAsDropDown(anchor, xOffset, yOffset); } public void dismiss() { window.dismiss(); } }
四、QuickAction
package net.londatiga.android; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.widget.TextView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup; import java.util.ArrayList; 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; 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.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; } public void setAnimStyle(int animStyle) { this.animStyle = animStyle; } public void addActionItem(ActionItem action) { actionList.add(action); } 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(); 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); } 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; } } 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); } } 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); text.setTextSize(14); } if (listener != null) { container.setOnClickListener(listener); } return container; } 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); } }
五、 TestQuickAction
package net.londatiga.android; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class TestQuickAction extends Activity { QuickAction qa; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final ActionItem first = new ActionItem(); first.setTitle("删除数据"); first.setIcon(getResources().getDrawable(R.drawable.dashboard)); first.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { qa.dismiss(); Toast.makeText(TestQuickAction.this, "Dashboard", Toast.LENGTH_SHORT).show(); } }); final ActionItem second = new ActionItem(); second.setTitle("更新数据"); // second.setIcon(getResources().getDrawable(R.drawable.kontak)); second.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { qa.dismiss(); Toast.makeText(TestQuickAction.this, "User & Group", Toast.LENGTH_SHORT).show(); } }); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { qa = new QuickAction(v); qa.addActionItem(first); qa.addActionItem(second); qa.show(); } }); Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { qa = new QuickAction(v); qa.addActionItem(first); qa.addActionItem(second); qa.setAnimStyle(QuickAction.ANIM_REFLECT); qa.show(); } }); Button btn3 = (Button) this.findViewById(R.id.btn3); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { qa = new QuickAction(v); qa.addActionItem(first); qa.addActionItem(second); qa.show(); } }); Button btn4 = (Button) this.findViewById(R.id.btn4); btn4.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { qa = new QuickAction(v); qa.addActionItem(first); qa.addActionItem(second); qa.setAnimStyle(QuickAction.ANIM_GROW_FROM_LEFT); qa.show(); } }); } }
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"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 1" /> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Button 2" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <Button android:id="@+id/btn3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="right" android:text="Button 3" /> </LinearLayout> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:text="Btn4" /> </LinearLayout>
action_item
<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:gravity="center" android:background="@drawable/action_item_btn"> <ImageView android:id="@+id/icon" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:paddingLeft="5dip" android:paddingRight="10dip" android:paddingBottom="5dip" android:textSize="21sp" android:textColor="#fff"/> </LinearLayout>
popup
<?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/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="10dip"/> </ScrollView > <ImageView android:id="@+id/arrow_up" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/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/arrow_down" /> </RelativeLayout>
(在F:\java\p自定义popupwindow\quickAction)
posted on 2013-01-21 15:19 732003684 阅读(13613) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步