Android的溢出菜单动画?

时间:2014-09-11 15:16:11

标签: android android-actionbar actionbarsherlock android-animation

当我按下操作栏中的溢出菜单时,下拉菜单会弹出一个动画。我正在检查sdk的res / anim文件夹,我想知道这个按钮使用哪个动画,所以当用户按下操作栏中的其他按钮时,我可以用它来弹出其他一些东西。

谢谢!

1 个答案:

答案 0 :(得分:0)

据我所知,在Android Api 23上,默认的下拉动画是由Transition实现的。您可以阅读PopupWindow.java的源代码以了解已完成的操作以及如何执行。

您可以在sdk的platform / android-23 / datas / res / transition目录中找到两个用于定义下拉动画转换的xml文件。(popup_window_enter.xml,popup_window_exit.xml) 不幸的是,您无法通过android.R.transition.popup_window_enter.xml引用它,因为它是隐藏的。但是您可以将其复制到您的项目中并使用它。

下面有一些我在项目中使用的代码。

public static void showOverflow(final RelativeLayout holder, final View anchor, final CardView cv) {
    holder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            hideOverflow(holder, cv);
        }
    });
    if (cv.getVisibility() != View.VISIBLE) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                final Rect episodeCenter = getTransitionEpicenter(anchor, cv);
                Transition transition = TransitionInflater.from(holder.getContext()).inflateTransition(R.transition.popup_window_enter);
                transition.setEpicenterCallback(new Transition.EpicenterCallback() {
                    @Override
                    public Rect onGetEpicenter(Transition transition) {
                        return episodeCenter;
                    }
                });
                TransitionManager.beginDelayedTransition(cv, transition);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        cv.setVisibility(View.VISIBLE);
    }
}

private static Rect getTransitionEpicenter(View anchor, View popup) {
    final int[] anchorLocation = new int[2];
    final int[] popupLocation = new int[2];
    anchor.getLocationOnScreen(anchorLocation);
    popup.getLocationOnScreen(popupLocation);
    final Rect bounds = new Rect(0, 0, anchor.getWidth(), anchor.getHeight());
    bounds.offset(anchorLocation[0] - popupLocation[0], anchorLocation[1] - popupLocation[1]);
    return bounds;
}