滞后的圆圈揭示动画

时间:2017-03-12 14:24:47

标签: android animation

按下按钮时,我正在使用此动画:

void circleAnimationEnter(final View view, final View view2) {


    // get the center for the clipping circle
    int cx = Math.round(view2.getX() + view2.getWidth() / 2);
    int cy = Math.round(view2.getY() - view2.getHeight() / 2);

    // get the final radius for the clipping circle
    int finalRadius = Math.max(view.getWidth(), view.getHeight());

    // create the animator for this view (the start radius is zero)
    Animator anim;
    Animation animation;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
        // make the view visible and start the animation
        view.setVisibility(View.VISIBLE);
        anim.setDuration(1000);
        anim.setInterpolator(new AccelerateInterpolator());
        anim.start();
    } else {
        view.setVisibility(View.VISIBLE);
        view.animate()
                .translationX(0)
                .setDuration(500)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                    }
                });
    }
}

View1是隐藏/显示的视图,view2是要按的按钮。

同样的动画(有些变化),当我按下相同的按钮再次改变可见度时隐藏。

问题在于,第一次按下按钮时,动画滞后(视图显示为圆形动画),但下次按下按钮时,视图可见性随动画而变化(两者都是完美地展示和隐藏。

我正在使用CollapsingToolbarLayout,也许这可能是问题?

是否滞后?或者只是第一次Android没有得到正确的X和Y?

感谢您的帮助,对不起我的英语!

编辑:

问题在于获取cx和cy的值。

Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;

    // get the center for the clipping circle
    cx = Math.round(width-width*10/100);
    cy = Math.round(height-height*38/100);

    initialRadius = Math.max(width*3/2, height*3/2);
    finalRadius = initialRadius;

我的动画不再滞后,但问题是如果工具栏折叠或展开,cx和cy正在改变...(我不明白这一点,因为我得到的屏幕大小,所以我的cx和cy应该是一样的...)

1 个答案:

答案 0 :(得分:0)

我解决了,问题是它崩溃时的应用栏......

final AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            // get the center for the clipping circle
            cx = Math.round(floatingActionButton.getX() + floatingActionButton.getWidth() / 2);

            boolean fullyExpanded = (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0;

            if (!fullyExpanded) {
                cy = Math.round(floatingActionButton.getY() - floatingActionButton.getHeight());
            } else {
                cy = Math.round(floatingActionButton.getY() + floatingActionButton.getHeight()/2) - appBarLayout.getHeight();
            }

            initialRadius = Math.max(width * 3 / 2, height * 3 / 2);
            finalRadius = initialRadius;
        }
    });

使用该代码,我完美地获得了fab按钮cx / cy,并添加了3/2到半径,以避免圆形动画效果的高度/宽度问题。