zoukankan      html  css  js  c++  java
  • 自定义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)

  • 相关阅读:
    (转)ANT与RTS的结合
    (转)[Android] 利用 ant 脚本修改项目包名
    (转)MULTIPLE TARGETS FROM ONE ANDROID SOURCE (THE BETTER WAY)
    JS+CSS打造网站头部蓝色简约可自动显示/隐藏的导航菜单
    CSS打造很棒的黑色背景下的导航菜单
    老外JS实现的Infinite Menus
    【荐】JavaScript打造的无限级可刷新树型折叠菜单
    【荐】纯CSS打造超酷的圆角菜单,鼠标移过向上/向下扩张
    来自阿里巴巴网的滑动TAB导航特效
    适用于商城JS实现的可折叠的商品分类导航
  • 原文地址:https://www.cnblogs.com/ct732003684/p/2869841.html
Copyright © 2011-2022 走看看