Dialog在android中的应用(二)

如果实现一个带动画的下拉的Dialog


沿用上篇的基类,实现实际上的子类:

public  class DropDownFilterDialogForPhone extends DropDownFilterDialog {
    private boolean mShowAnimation = true;
    private boolean mIsInAnimation;
    private boolean mFinishShowDialog = false;

    public DropDownFilterDialogForPhone(Context context) {
        super(context);
        Window window = getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
        lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drop_down_filter_dialog);
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mShowAnimation) {
            Animation downAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.drop_down_menu_down_anim);
            downAnimation.setAnimationListener(new Animation.AnimationListener() {

                @Override
                public void onAnimationEnd(Animation animation) {
                    mFinishShowDialog = true;
                    mIsInAnimation = false;
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }

                @Override
                public void onAnimationStart(Animation animation) {
                }

            });
            mDropDownMenuLayout.startAnimation(downAnimation);
            mIsInAnimation = true;
        } else {
            mFinishShowDialog = true;
        }
    }

    public void hideDropDownFilter(boolean showAnimation) {
        Animation upAnimation = AnimationUtils.loadAnimation(mContext, R.anim.drop_down_menu_up_anim);
        upAnimation.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                dismiss();
                mIsInAnimation = false;

            }
        });
        startGridViewUpAnimation(upAnimation);
        mDropdownClickListener.onDropdownHide();
        mIsInAnimation = true;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (mFinishShowDialog) {
                if (!mIsInAnimation) {
                    hideDropDownFilter(true);
                }
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (mFinishShowDialog) {
                if (!mIsInAnimation) {
                    hideDropDownFilter(true);
                }
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }


    @Override
    protected void onStop() {
        super.onStop();
    }


    public void showDialog(boolean showAnimation, View banner) {
        Window window = getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        int positionY = mContext.getResources().getDimensionPixelSize(R.dimen.header_hight);
        if (banner == null) {
            lp.y = positionY;
        } else {
            lp.y = positionY + banner.getMeasuredHeight();
        }
        mShowAnimation = showAnimation;
        show();
    }

    public void startGridViewUpAnimation(Animation animation) {
        mDropDownMenuLayout.startAnimation(animation);
    }
}
   @Override
    public void onClick(View v) {
        if (null == mHeaderClickListener) {
            return;
        }
        super.onClick(v);
        switch (v.getId()) {
            case R.id.title_layout:
                if(mBtnDropDownImageview.getVisibility() == View.GONE) {
                    return;
                }
                if (!mIsShowDialog) {
                    // will show dialog
                    showDropDownFilter(true);
                    mIsShowDialog = true;
                } else {
                    mDropDownFilterDialog.hideDropDownFilter(true);
                    mIsShowDialog = false;
                }
                break;
        }

    }

    public void setOnDropDownMenuClick(DropDownMenuClicked mDropDownMenuClicked) {
        this.mDropDownMenuClicked = mDropDownMenuClicked;
    }


    public void setDropDownMenuVisible(int visible) {
        if(visible == View.VISIBLE) {
            mBtnDropDownImageview.setVisibility(View.VISIBLE);
        }else{
            mBtnDropDownImageview.setVisibility(View.GONE);
        }
    }


    public void rotatePlusButton(Context context, boolean isUp) {
        AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(
                context, isUp ? R.anim.flip_up : R.anim.flip_down);
        animatorSet.setTarget(mBtnDropDownImageview);
        animatorSet.start();
    }


    private void showDropDownFilter(boolean showAnimation) {
        if (mDropDownFilterDialog == null) {
            if(false) {
                mDropDownFilterDialog = new DropDownFilterDialogForTablet(getContext());
            }else{
                mDropDownFilterDialog = new DropDownFilterDialogForPhone(getContext());
            }
        }

        rotatePlusButton(mContext, false);
        mDropDownFilterDialog.setCurrentIndex(mCurrentIndex);
        mDropDownFilterDialog.setTopMenuItemList(mDropDownItemList);
        mDropDownFilterDialog.showDialog(showAnimation, mBanner);
        mDropDownFilterDialog.setDropDownClickListener(new DropDownFilterDialog.OnDropdownClickListener() {
            @Override
            public void onDropdownHide() {
                rotatePlusButton(mContext, true);
                mIsShowDialog = false;
            }

            @Override
            public void onClickItem(int index) {
                if (index == mCurrentIndex) {
                    return;
                }
                mCurrentIndex = index;
                mDropDownMenuClicked.onDropDownMenuClicked(index);
            }
        });
    }



    /*****************************************init filter*************************************************/
    public int getCurrentIndex() {
        return mCurrentIndex;
    }



    public void initMessageFilterWithState(int state) {
        mCurrentIndex = state;
        switch (state) {
            case STATE_ALL:
                setText(R.string.messages_bar_item_all);
                break;
            case STATE_VOICE:
                setText(R.string.messages_bar_item_voice);
                break;
            case STATE_FAX:
                setText(R.string.messages_bar_item_fax);
                break;
            case STATE_TEXT:
                setText(R.string.messages_bar_item_text);
                break;
        }
    }


动画的定义:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="-100%"
        android:toYDelta="0%"
        android:duration="@integer/gridview_duration"
    />
</set>

在Titlebar里面点击的代码可以这样写:


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。