android:visibility changes to children of MotionLayout

前端 未结 5 1802
灰色年华
灰色年华 2020-12-05 10:18

I must be missing something with android:visibility changes within a motion layout. Here’s a simplified version of my layout.


 

        
相关标签:
5条回答
  • 2020-12-05 10:39

    Set visibilityMode property to normal, working fine for me with 2.0.0-beta3.

     app:visibilityMode="normal"
     android:visibility="visible"
    
    0 讨论(0)
  • 2020-12-05 10:47

    The other option depending on your use case is to make sure the view you want to control the visibility of isn't a direct descendant of the MotionLayout. Place it in a container view and you'll be able to set the visibility as normal

    0 讨论(0)
  • 2020-12-05 10:54

    Programmatically way

    View clickableArea = motionLayout.findViewById(R.id.video_overlay_thumbnail);    
    motionLayout.getConstraintSet(R.id.start).getConstraint(clickableArea.getId()).propertySet.mVisibilityMode = 1; // 1 - ignore or 0 - normal
    clickableArea.setVisibility(GONE);
    
    0 讨论(0)
  • 2020-12-05 10:57

    Turns out this was my inexperience with how MotionLayout works. By default MotionLayout controls the visibility of all views within it. But you can opt out child views by using the app:visibilityMode="ignore" attribute and defining the view in the <ConstraintSet>

    In my case <CustomViewGroup1> looks like this...

    <Constraint
          android:id="@id/CustomViewGroup1"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/HeaderBackground"
          app:layout_constraintVertical_weight="1"
          app:visibilityMode="ignore" />
    

    And this is defined the same in both collasped and expended ConstraintSets as I don't want it to move/animation when the recycler view is scrolled.

    Thanks to John Hoford for the advice in another channel.

    0 讨论(0)
  • 2020-12-05 11:01

    My approach is to exclude the view from the motion layout, ignore the visibility from the scene so it can be programmatic and also inherit the constraints in the end constraint set.

    The documentation mentioned the app:applyMotionScene="boolean" but it doesn't tell you where. It has to be in a PropertySet

    Also visibilityMode only worked for me inside a PropertySet as well

    <?xml version="1.0" encoding="utf-8"?>
    <MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:motion="http://schemas.android.com/apk/res-auto"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <Transition
            ...
        </Transition>
    
        <ConstraintSet android:id="@+id/start">
    
            <Constraint android:id="@id/viewId">
                <PropertySet
                    app:applyMotionScene="false"
                    app:visibilityMode="ignore" />
            </Constraint>
    
        </ConstraintSet>
    
        <ConstraintSet
            android:id="@+id/end"
            motion:deriveConstraintsFrom="@id/start">
            ...
        </ConstraintSet>
    
    </MotionScene>
    

    Careful with the app namespace auto-import from motion scene, that one is wrong you have to use the same that is used on the layouts.

    The benefit of this is:

    • No width, height or constraints in the scene
    • No need to repeat the properties since is derived from the start constraint set
    0 讨论(0)
提交回复
热议问题