Подтвердить что ты не робот

Невозможно запустить этот аниматор на отдельном экране! выявить эффект

Я пытаюсь создать эффект раскрытия в своем приложении, но безуспешно. То, что я хочу, открывает карту, когда я открываю фрагмент. Я пробовал до сих пор:

private void toggleInformationView(View view) {
        infoContainer = view.findViewById(R.id.contact_card);

        int cx = (view.getLeft() + view.getRight()) / 2;
        int cy = (view.getTop() + view.getBottom()) / 2;
        float radius = Math.max(infoContainer.getWidth(), infoContainer.getHeight()) * 2.0f;

        if (infoContainer.getVisibility() == View.INVISIBLE) {
            infoContainer.setVisibility(View.VISIBLE);
            ViewAnimationUtils.createCircularReveal(infoContainer, cx, cy, 0, radius).start();
        } else {
            Animator reveal = ViewAnimationUtils.createCircularReveal(
                    infoContainer, cx, cy, radius, 0);
            reveal.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    infoContainer.setVisibility(View.INVISIBLE);
                }
            });
            reveal.start();
        }
    }

а в onCreateView я начал метод:

toggleInformationView(view);

это карта:

<android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:id="@+id/contact_card"
        android:visibility="invisible"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:elevation="4dp"
        android:foreground="?android:attr/selectableItemBackground"
        android:orientation="vertical"
        android:padding="10dp"
        card_view:cardCornerRadius="2dp" >

        <LinearLayout   
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
            <ImageView
                android:id="@+id/bg_contact"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_weight="0"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:src="@drawable/banner" />

        </LinearLayout>
    </android.support.v7.widget.CardView>

и logcat:

11-08 17:25:48.541: E/AndroidRuntime(26925): java.lang.IllegalStateException: Cannot start this animator on a detached view!
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.view.RenderNode.addAnimator(RenderNode.java:817)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.view.RenderNodeAnimator.setTarget(RenderNodeAnimator.java:277)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.view.RenderNodeAnimator.setTarget(RenderNodeAnimator.java:261)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.animation.RevealAnimator.<init>(RevealAnimator.java:37)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.view.ViewAnimationUtils.createCircularReveal(ViewAnimationUtils.java:48)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at com.as.asapp.TFragment.toggleInformationView(TFragment.java:64)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at com.as.asapp.TFragmentshowInformation(TFragment.java:52)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at com.as.asapp.TFragment.onCreateView(TFragment.java:37)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.os.Handler.handleCallback(Handler.java:739)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.os.Looper.loop(Looper.java:135)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at android.app.ActivityThread.main(ActivityThread.java:5221)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at java.lang.reflect.Method.invoke(Native Method)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at java.lang.reflect.Method.invoke(Method.java:372)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-08 17:25:48.541: E/AndroidRuntime(26925):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Проверка, кажется, что getWidth() и getHeight() возвращает 0. Но я не знаю, является ли это реальной проблемой. Благодаря

4b9b3361

Ответ 1

Вот как я это решил, я добавил слушателя onLayoutChange в представление в обратном вызове onCreateView, поэтому всякий раз, когда он привязан к представлению и готов к рисованию, он делает раскрытие

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_map_list, container, false);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                @TargetApi(Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                    v.removeOnLayoutChangeListener(this);
                    toggleInformationView(view);
                }
            });
        }
        return view;
    }

Ответ 2

Вы можете использовать runnable для создания анимации. Runnable будет запускаться после создания представления.

view.post(new Runnable() {
            @Override
            public void run() {
                //create your anim here
            }
        });

Ответ 4

Как просто разместить метод в методе onViewCreated():

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        toggleInformationView(view);
    }

работает

Ответ 5

ах, наконец, вот решение этой ошибки. На самом деле, проблема в том, что мы назначаем представление анимации с его высотой и шириной, и вдруг мы не заметили, что может быть случай, когда представление, которое мы назначаем для анимации, не будет загружаться должным образом. Так что для этого нам нужно подождать, пока просмотр загрузится правильно.

LayoutInflater inflater = this.getLayoutInflater();
View rowView = inflater.inflate( R.layout.fileselecttype,null, true );

rowView   or [Your View]

[Your View].post(new Runnable() {
            @Override
            public void run() {
                //Do your animation work here.
            }
        });

Ответ 6

Попробуйте вызвать его по методу onViewCreated

Ответ 7

Использовать ViewTreeObserver.

 ViewTreeObserver viewTreeObserver = rootLayout.getViewTreeObserver();
    if (viewTreeObserver.isAlive()) {
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                revealActivity(revealX, revealY);
                rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
    }

Ответ 8

упрощенный вне рамок вопроса

private void startAnimation(@NonNull final View view, @NonNull final Runnable onAttachedToWindow) {
    if (view.isAttachedToWindow()) {
        onAttachedToWindow.run();
    } else {
        view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
            public void onViewAttachedToWindow(View view) {
                onAttachedToWindow.run();
                view.removeOnAttachStateChangeListener(this)
            }

            @Override
            public void onViewDetachedFromWindow(View view) {

            }
        });
    }
}

вызовите startAnimation для одной или нескольких анимаций

startAnimation(view, new Runnable() {
        @Override
        public void run() {
          //the code inside toggleInformationView(view)
        }
    });

Ответ 9

Я использовал пользовательский вид, поэтому я использовал метод isAttachedToWindow(), чтобы проверить, прикреплен ли вид, и избегать показаний, пока вид не подключен.

Ответ 10

Проверьте, прикреплен ли ваш макет к окну или нет с помощью rootLayout.isAttachedToWindow().

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (rootLayout!= null) {

            if(rootLayout.isAttachedToWindow()) {
                ViewTreeObserver viewTreeObserver = drawerLayout.getViewTreeObserver();
                if (viewTreeObserver.isAlive()) {
                    viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            startRevealAnimation(rootLayout);
                            rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        }
                    });
                }
            }
        }