Why doesn't setVisibility work after a view is animated?

后端 未结 6 1732
别跟我提以往
别跟我提以往 2020-12-04 20:56

Why doesn\'t the textView become invisible?

Here is my layout xml:




        
相关标签:
6条回答
  • 2020-12-04 21:26

    Another way to work around this is to wrap your animated view in another view and set the visibility of that wrapper view.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical" >
        <FrameLayout 
            android:id="@+id/animationHoldingFrame"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                 android:id="@+id/tvRotate"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="Rotate Me"
            />
        </FrameLayout>
    </LinearLayout>
    

    And the code then becomes this:

    TextView tvRotate = (TextView) findViewById(R.id.tvRotate);
    FrameLayout animationContainer = (FrameLayout)findViewById(R.id.animationHoldingFrame)
    
    RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    r.setDuration(0);
    r.setFillAfter(true);
    tvRotate.startAnimation(r);
    animationContainer.setVisibility(View.INVISIBLE);
    
    0 讨论(0)
  • 2020-12-04 21:42

    For me calling clearAnimation of the View fixed the problem. In my case I wanted to set the View back to its original position after doing a translation with fillAfter set to true.

    0 讨论(0)
  • 2020-12-04 21:42

    I came up with a workaround for this: basically right before you call setVisibility(View.GONE), do an animation with duration=0 setFillAfter(false) and have the angle from/to set to the current angle of rotation.

    This will clear the setFillAfter bitmap and allow the view to be gone.

    0 讨论(0)
  • 2020-12-04 21:43

    Use this before setVisibility after animation is completed:

    anim.reverse();
    anim.removeAllListeners();
    anim.end();
    anim.cancel();
    

    where anim is your ObjectAnimator

    but if you are using the Animation class, then just do:

    view.clearAnimation();
    

    on the view upon which the animation was performed

    0 讨论(0)
  • 2020-12-04 21:52

    All the animations (before android 3.0) are actually applied to a bitmap which is a snapshot of your view instead of on your original view. When you are setting the fill after to true this actually means that the bitmap will continue to be displayed on the screen instead of your view. This is the reason why the visibility won't change upon using setVisibility and also the reason why your view will not be receiving touch events in its new (rotated) bounds. (but since you're rotating on 180 degrees that's not an issue).

    0 讨论(0)
  • 2020-12-04 21:52

    I ended up requiring API Level 11 and using setRotation to accomplish this. This seems like a pretty simple requirement that can't be done pre-Honeycomb though. All i wanted to do was rotate a button and then hide/show it.

    0 讨论(0)
提交回复
热议问题