Android: 指定循环显示动画起始位置?

Android: specify circular reveal animation starting position?

我目前有一个从工具栏最右侧开始的圆形显示动画。我希望初始圆心从 "search" 图标开始,这让我很难找到答案。我尝试更改 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();
                }

试试这个:

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>

确保视图 "view" 设置为该布局的 ID

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

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

view.setVisibility(View.VISIBLE);

希望对您有所帮助。

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);
}

你可以试试这个:

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