重新着色转换不适用于VIewGroup吗?

时间:2017-07-12 18:19:14

标签: android android-transitions android-viewgroup

我有场景转换,我想使用重新着色动画将ViewGroup的背景从透明变为另一种颜色。这是我的login_to_register.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
   <fade android:fadingMode="fade_out"/>
   <fade android:fadingMode="fade_in">
      <targets>
         <target android:targetId="@id/passwordEditor" />
         <target android:targetId="@id/loginNameEditor" />
      </targets>
   </fade>
   <!--<changeTransform />-->
   <changeBounds />
   <recolor>
      <targets>
         <target android:targetId="@id/loginOptions" />
      </targets>
   </recolor>
</transitionSet>

这是片段布局的XML,它位于ViewPager中。

<FrameLayout
      android:layout_width="match_parent" android:layout_height="match_parent">

      <ImageView
         android:layout_width="match_parent" android:layout_height="match_parent"
         android:scaleType="centerCrop"
         android:src="@drawable/onboarding_bg"
         />

      <LinearLayout
         android:id="@+id/loginOptions"
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginLeft="@dimen/activity_horizontal_margin"
         android:layout_marginRight="@dimen/activity_horizontal_margin"
         android:background="@android:color/transparent"
         android:layout_gravity="bottom"
         android:gravity="center_horizontal"
         >
         <android.support.design.widget.TextInputLayout
            android:id="@+id/loginNameEditor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/email"
            app:errorEnabled="true"
            app:hintTextAppearance="@style/BlackFloatingTextTextAppearance"
            android:visibility="gone"
            tools:visibility="visible"
            >
            <android.support.design.widget.TextInputEditText
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="@={regModel.emailAddress, default=`twinkle`}"
               android:inputType="textEmailAddress"
               android:maxLength="254"
               android:onFocusChange="@{(v, focus) -> context.loginFocusChanged(true, focus)}"
               android:afterTextChanged="@{() -> context.loginTextChanged()}"
               />
         </android.support.design.widget.TextInputLayout>

         <android.support.design.widget.TextInputLayout
            android:id="@+id/passwordEditor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            app:passwordToggleEnabled="true"
            app:errorEnabled="true"
            app:hintTextAppearance="@style/BlackFloatingTextTextAppearance"
            app:counterEnabled="true"
            app:counterMaxLength="50"
            android:visibility="gone"
            tools:visibility="visible"
            >
            <android.support.design.widget.TextInputEditText
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="@={regModel.password}"
               android:inputType="textPassword"
               android:fontFamily="monospace"
               android:onFocusChange="@{(v, focus) -> context.loginFocusChanged(false, focus)}"
               android:afterTextChanged="@{() -> context.loginTextChanged()}"
               />
         </android.support.design.widget.TextInputLayout>

         <TextView
            android:id="@+id/error"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingStart="4dp"
            android:paddingEnd="4dp"
            android:textAppearance="@style/TextAppearance.Design.Error"
            android:gravity="start"
            android:visibility="gone"
            tools:visibility="visible"
            />

         <!--<Button-->
         <!--android:id="emailAuthButton"-->
         <!--android:layout_width="wrap_content"-->
         <!--android:layout_height="wrap_content"-->
         <!--android:layout_marginTop="@dimen/loginButtonSpacing"-->
         <!--android:text="@string/login"-->
         <!--style="@style/PrimaryColorButtonBorderlessStyle"-->
         <!--android:onClick="loginEmail"-->
         <!--/>-->

         <com.google.android.gms.common.SignInButton
            android:id="@+id/googButton"
            android:layout_width="230dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/loginButtonSpacing"
            android:layout_marginTop="@dimen/loginButtonSpacing"
            android:onClick="loginGoogle"
            app:buttonSize="wide"
            />

         <com.facebook.login.widget.LoginButton
            android:id="@+id/fbButton"
            android:layout_width="220dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/loginButtonSpacing"
            app:com_facebook_login_text="@string/com_facebook_loginview_log_in_button"
            android:layout_marginBottom="@dimen/loginButtonSpacing"
            android:paddingTop="12dp"
            android:paddingBottom="12dp"
            android:onClick="loginFB"
            />

         <TextView
            android:id="@+id/emailInfo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:layout_marginTop="@dimen/register_row_spacing"
            android:layout_marginStart="10dp"
            android:text="@string/unauth_email_prompt"
            android:textColor="?android:attr/textColorPrimaryInverse"
            />

         <Button
            android:id="@+id/unfederatedButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/loginButtonSpacing"
            android:layout_marginBottom="@dimen/loginButtonSpacing"
            android:text="@string/create_account"
            style="@style/ScalableBorderlessButton"
            android:textColor="@color/colorAccent"
            android:minHeight="53dp"
            android:onClick="showUnfederatedUI"
            />
         <TextView
            android:id="@+id/forgotPassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:layout_marginTop="15dp"
            android:paddingTop="@dimen/smallLinkTopPadding"
            android:paddingBottom="@dimen/smallLinkBottomPadding"
            android:paddingLeft="@dimen/smallLinkHPadding"
            android:paddingRight="@dimen/smallLinkHPadding"
            app:hypertext="@{R.string.forgot_pass}"
            android:background="?android:attr/selectableItemBackground"
            tools:text="@string/forgot_pass"
            android:textSize="@dimen/smallLinkTextSize"
            android:onClick="recoverPassword"
            android:visibility="gone"
         />
      </LinearLayout>
   </FrameLayout>

现在我要使用Recolor的视图是id loginOptions。您可以看到我在转换中给出了特定的targetId。如果从null开始有任何问题,它将默认为transparent。所以这是开始场景转换的代码

    val trans = TransitionInflater.from(this).inflateTransition(R.transition.login_to_register)
    TransitionManager.beginDelayedTransition(this.dataBinding.root, trans)
    this.loginBinding!!.loginNameEditor.visibility = View.VISIBLE
    this.loginBinding!!.passwordEditor.visibility = View.VISIBLE
    this.loginBinding!!.error.visibility = View.VISIBLE
    this.loginBinding!!.googButton.visibility = View.GONE
    this.loginBinding!!.fbButton.visibility = View.GONE
    this.loginBinding!!.emailInfo.visibility = View.GONE
    this.loginBinding!!.forgotPassword.visibility = View.VISIBLE

    val color = this.resources.getColor(R.color.almostWhite)
    this.loginBinding!!.loginOptions.background = ColorDrawable(color)

我不包括ViewPager的活动布局,它很简单,并且可能没有任何问题,因为所有其他转换都有效!是的,所有VISIBILITY更改都正常工作,并且边界发生了变化。 重新着色有什么问题?修改:让我补充一点,如果我删除<recolor>@id/loginOptions 的背景会更改为almostWhite

2 个答案:

答案 0 :(得分:0)

这报告给了 Google issue tracker,有一个适合我的解决方案,这就是我接受这个的原因。

要在转换xml中使用自定义转换,请执行以下操作:

<transition 
        class="com.example.BackgroundRecolor" 
        android:duration="200"/> 

在自定义转换中从Transition添加构造函数以支持xml属性:

public BackgroundRecolor() {} 

public BackgroundRecolor(Context context, AttributeSet attrs) { 
    super(context, attrs); 
}

答案 1 :(得分:0)

我正在查看我找到here的重新着色来源,它似乎只捕获TextViews的值。我不知道这是不是最新版本,我现在无法测试。

或者,尝试找到here的(优秀)TransitionsEverywhere库,我已经并排测试了(Android Transitions vs. Library),它们都执行相同的操作。值得一试,因为您所要做的就是更改命名空间:)(或者您甚至可以通过查看现有的源代码来创建适合您想要的“重新着色”版本。

更新:通过查看更新的源代码(甚至是Recolor的TransitionsEverywhere版本),它似乎现在可以捕获视图的背景。 (Source

它与Android原生版本相同:

transitionValues.values.put(PROPNAME_BACKGROUND,
                            transitionValues.view.getBackground());

也许您可以尝试使用TransitionDrawable? 请参阅this StackOverflow问题/答案组合。