美文网首页
PopupWindow简单动画弹窗

PopupWindow简单动画弹窗

作者: 周大侠侠侠侠侠侠侠侠侠侠侠侠侠 | 来源:发表于2018-11-08 15:19 被阅读0次

    写在前面

    主要感觉自己对于博客这个东西感觉很手生,现拿一些简单的东西来练练手,先练练等级,然后再去做一些分析类的文章,这样可能会好一点,感觉abcd的代码居然比中文的博客还好写,我也是服了我自己

    内容

    先来一个简单的PopupWindow弹出效果,主要是showAtLocation()和showAsDropDown()显示的动画效果不同,所以就需要进行统一一下。
    主要思路:因为PopupWindow其实也是一个View,所以只要show()的时候对布局显示的时候开始动画,dimiss()的时候开始关闭动画就可以


    321.gif

    代码

    动效 就是简单的上下偏移的动画 这里是可以自己设置

        private Animation createVerticalAnimation(float fromY, float toY) {
            Animation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
                    0f,
                    Animation.RELATIVE_TO_SELF,
                    0f,
                    Animation.RELATIVE_TO_SELF,
                    fromY,
                    Animation.RELATIVE_TO_SELF,
                    toY);
            animation.setDuration(300);
            animation.setInterpolator(new DecelerateInterpolator());
            return animation;
        }
    

    自定义Show方法

    public void showPopupWindow(View v) {
            //获取控件的位置坐标
            v.getLocationOnScreen(location);
            //获取自身的长宽高
            mRootView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            //获取屏幕高度
            int measuredHeight = mRootView.getMeasuredHeight();
            int measuredWidth = mRootView.getMeasuredWidth();
            int width = v.getMeasuredWidth();
            //如果在一半的上方 显示在下面 在一半的下方显示在上面
            if (location[1] > ScreenUtils.getScreenHeight() / 2) {
                showAnim = createVerticalAnimation(1, 0);
                hideAnim = createVerticalAnimation(0, 1);
                mRootView.startAnimation(showAnim);
                this.showAtLocation(v, Gravity.NO_GRAVITY, (location[0] - measuredWidth + width), location[1] - measuredHeight-20);
            } else {
                showAnim = createVerticalAnimation(-1, 0);
                hideAnim = createVerticalAnimation(0, -1);
                mRootView.startAnimation(showAnim);
                this.showAsDropDown(v, -measuredWidth + width, 20);
            }
            hideAnim.setAnimationListener(new AnimListener() {
                @Override
                public void onAnimationEnd(Animation animation) {
                    CirclePopupWindow.super.dismiss();
                }
            });
        }
    

    完整代码,布局就不贴了

    
    /**
     * title:点击更多弹窗效果
     * tip:
     *
     * @author zhou
     * @date 2018-10-29 上午10:15
     */
    public class CirclePopupWindow extends PopupWindow {
    
        private List<PopupEntity> mData;
        private Context mContext;
        private View mRootView;
        private Animation showAnim, hideAnim;
    
    
        public CirclePopupWindow(Context context, List<PopupEntity> list) {
            super(context);
            mContext = context;
            mData = list;
            initialize();
        }
    
        private void initialize() {
            mRootView = LayoutInflater.from(mContext).inflate(R.layout.popupwindow, null);
            RecyclerView mRvList = mRootView.findViewById(R.id.rv_list);
            mRvList.setLayoutManager(new LinearLayoutManager(mContext));
            RecyclerPopupAdapter adapter = new RecyclerPopupAdapter();
            adapter.setNewData(mData);
            mRvList.setAdapter(adapter);
            adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                    if (mData != null) {
                        ToastUtils.showShort(mData.get(position).getContent());
                    }
                }
            });
            this.setContentView(mRootView);
            this.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(mContext, android.R.color.transparent)));
            this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
            this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
            this.setFocusable(true);
            this.setOutsideTouchable(true);
            this.update();
    
        }
    
        private int[] location = new int[2];
    
        public void showPopupWindow(View v) {
            //获取控件的位置坐标
            v.getLocationOnScreen(location);
            //获取自身的长宽高
            mRootView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            //获取屏幕高度
            int measuredHeight = mRootView.getMeasuredHeight();
            int measuredWidth = mRootView.getMeasuredWidth();
            int width = v.getMeasuredWidth();
            //如果在一半的上方 显示在下面 在一半的下方显示在
            if (location[1] > ScreenUtils.getScreenHeight() / 2) {
                showAnim = createVerticalAnimation(1, 0);
                hideAnim = createVerticalAnimation(0, 1);
                mRootView.startAnimation(showAnim);
                this.showAtLocation(v, Gravity.NO_GRAVITY, (location[0] - measuredWidth + width), location[1] - measuredHeight-20);
            } else {
                showAnim = createVerticalAnimation(-1, 0);
                hideAnim = createVerticalAnimation(0, -1);
                mRootView.startAnimation(showAnim);
                this.showAsDropDown(v, -measuredWidth + width, 20);
            }
            hideAnim.setAnimationListener(new AnimListener() {
                @Override
                public void onAnimationEnd(Animation animation) {
                    CirclePopupWindow.super.dismiss();
                }
            });
        }
    
        @Override
        public void dismiss() {
            if (hideAnim != null) {
                mRootView.startAnimation(hideAnim);
            } else {
                super.dismiss();
            }
        }
    
        private Animation createVerticalAnimation(float fromY, float toY) {
            Animation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
                    0f,
                    Animation.RELATIVE_TO_SELF,
                    0f,
                    Animation.RELATIVE_TO_SELF,
                    fromY,
                    Animation.RELATIVE_TO_SELF,
                    toY);
            animation.setDuration(300);
            animation.setInterpolator(new DecelerateInterpolator());
            return animation;
        }
    
        public class AnimListener implements Animation.AnimationListener {
            @Override
            public void onAnimationStart(Animation animation) {}
    
            @Override
            public void onAnimationEnd(Animation animation) {}
    
            @Override
            public void onAnimationRepeat(Animation animation) {}
        }
    }
    

    相关文章

      网友评论

          本文标题:PopupWindow简单动画弹窗

          本文链接:https://www.haomeiwen.com/subject/airwxqtx.html