Android:指定圆形揭示动画的起始位置?

时间:2017-01-28 11:59:41

标签: java android android-animation circularreveal

我目前有一个从工具栏右侧开始的圆形显示动画。我希望初始圈中心从“搜索”图标开始,这个图标让我很难找到答案。我尝试更改cxxy值,但未成功。任何帮助表示赞赏。

final Toolbar search_bar = (Toolbar) findViewById(R.id.search_toolbar);

                if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    int cx = search_bar.getWidth();
                    int cy = search_bar.getHeight()/2;

                    float finalRadius = (float) Math.hypot(cx, cy);

                    Animator anim =
                            ViewAnimationUtils.createCircularReveal(search_bar, cx, cy, 0, finalRadius);

                    search_bar.setVisibility(View.VISIBLE);
                    anim.start();
                }

enter image description here

3 个答案:

答案 0 :(得分:1)

试试这个:

public void startCircularReveal() {
    final View view = findViewById(R.id.linearLayout);
    final View startView = findViewById(R.id.button_container);
    int cx = (startView.getLeft() + startView.getRight()) / 2;
    int cy = (startView.getTop() + startView.getBottom()) / 2;
    view.setBackgroundColor(Color.parseColor("#6FA6FF"));
    int finalRadius = Math.max(cy , view.getHeight() - cy);
    Animator anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
    anim.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {

        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
    anim.setDuration(200);
    view.setVisibility(View.VISIBLE);
    anim.start();
}

将视图更改为您要在其上显示的视图(通常是根视图),然后将startView更改为" search"图标视图和onAnimationEnd在显示完成后做任何你想做的事。

更新

如果展示不在您的观看之上,可以通过将此视图添加到布局底部来解决此问题

            <LinearLayout
                android:id="@+id/linearLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/custom_theme_color"
                android:orientation="vertical"
                android:visibility="invisible">
            </LinearLayout>

确保视图&#34;查看&#34;设置为该布局的ID

final View view = findViewById(R.id.linearLayout);

基本上我所做的是添加一个LinearLayout并设置其宽度和高度以匹配match_parent,因此这个视图位于所有内容的顶部,此视图是显示在其上的位置,并确保视图不在&# 39;影响你的布局我将可见性设置为不可见,并在显示开始时将其设置为可见:

view.setVisibility(View.VISIBLE);

我希望它有所帮助。

答案 1 :(得分:0)

revealView(listview, RssFragment.this.ll);

public  void revealView(View toBeRevealed, View frame)
{
    if (!ViewCompat.isAttachedToWindow(toBeRevealed))
    {
        return;
    }
    if (VERSION.SDK_INT >= 21)
    {
        Animator anim = ViewAnimationUtils.createCircularReveal(toBeRevealed, (frame.getLeft() + frame.getRight()) / 2, (frame.getTop() + frame.getBottom()) / 2, 0.0f, (float) Math.max(frame.getWidth(), frame.getHeight()));
        toBeRevealed.setVisibility(View.VISIBLE);
        anim.start();
        return;
    }
    toBeRevealed.setVisibility(View.VISIBLE);
}

答案 2 :(得分:0)

你可以试试这个:

enter i
nt cx = search_bar.getRight() * 5 / 6;
int cy = (search_bar.getTop() + search_bar.getBottom()) / 2;