博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义popupwindow(解决位置控制困惑)
阅读量:4472 次
发布时间:2019-06-08

本文共 13959 字,大约阅读时间需要 46 分钟。

一。main.xml

二、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
actionList; public QuickAction(View anchor) { super(anchor); actionList = new ArrayList
(); 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

action_item

popup

(在F:\java\p自定义popupwindow\quickAction)

 

转载于:https://www.cnblogs.com/ct732003684/archive/2013/01/21/2869841.html

你可能感兴趣的文章
SCR文件的关联被AutoCAD所取代的解决办法
查看>>
安装并使用PICT,生成测试用例
查看>>
我们都是爪哇狗
查看>>
背包问题
查看>>
【转】数据库--视图的基本概念以及作用
查看>>
单例模式
查看>>
多线程Server client
查看>>
20170922-构建之法:现代软件工程-阅读笔记
查看>>
Linux心得记录
查看>>
windows批量停止服务
查看>>
7.创建动态绑定
查看>>
temp--test audio micphone
查看>>
开展一个深度学习项目
查看>>
一些同形异码字符
查看>>
poj 2104 K-th Number(可持久化线段树)/hdu 2665
查看>>
如何在vue2.0项目中引用element-ui和echart.js
查看>>
VS单元测试
查看>>
python的set集合去重功能
查看>>
struts2 result type的类型
查看>>
Git教程
查看>>