Android:<include>与RippleEffect&amp; StateListAnimator

时间:2016-01-08 09:50:58

标签: android android-layout rippledrawable android-include

我有一个布局,包括另一个布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical"
          android:id="@+id/layout1">

    <include layout="@layout/my_layout"/>
</LinearLayout>

我需要在包含的布局中添加RippleEffect和StateListAnimator。

示例:

<include layout="@layout/my_layout"
          android:stateListAnimator="@anim/lift_up"
          android:background="@drawable/ripple_effect"/>

RippleEffect和StateListAnimator都可以100%运行。我不能改变包含的布局。因此,我需要对include标签或父布局本身进行效果。

我尝试了两种技术,但都没有成功。

  

更新

如果可能,应该以编程方式关闭。

  

更新2

其次,how would I go about keep the View elevated,一旦动画了吗?

2 个答案:

答案 0 :(得分:3)

您需要找到视图并调用适当的方法来更改状态列表动画和背景。您可能还需要在包含布局的根视图上调用setClickable。

LinearLayout layout1 = findViewById(R.id.layout1);
View root = layout1.getChildAt(0);

StateListAnimator sla = AnimatorInflater.loadStateListAnimator(context, R.anim.lift_up); 
root.setStateListAnimator(sla);
root.setBackground(R.drawable.ripple_effect);

答案 1 :(得分:2)

基于帖子Does Android XML Layout's 'include' Tag Really Work?LayoutInflater.java,似乎<include>标记仅支持android:idlayout_*android:visibility属性。因此,设置backgroundstateListAnimator的代码无效。

使用@Stepane代码解决以下问题:

  

您的方法可以正确启用涟漪效果,但SLA不是   被解雇。我看不到任何高度发生

如果膨胀的视图是透明的,则高程不可见,您必须设置viewOutline或使用一些非透明颜色的视图来查看阴影。

来自 ViewOutlineProvider documentation的摘录:

  

View构建其Outline的接口,用于阴影投射   和裁剪。

要设置outlineProvider,您可以使用View#setOutlineProvider (ViewOutlineProvider provider)方法,也可以通过android:outlineProvider xml标记进行设置。

更新代码:

LinearLayout root =(LinearLayout) findViewById(R.id.container);
StateListAnimator sla = AnimatorInflater.loadStateListAnimator(this, R.animator.lift_up);
root.setStateListAnimator(sla);
root.setClickable(true);
root.setOutlineProvider(ViewOutlineProvider.PADDED_BOUNDS);
root.setBackground(ContextCompat.getDrawable(this, R.drawable.ripple_effect));

<强> ripple_effect.xml

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="?android:colorAccent"
    tools:ignore="NewApi">
  <item>
    <shape
        android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>            
        <!-- Doesn't require outlineProvider
        <solid android:color="@android:color/darker_gray"/>
        -->
    </shape>
  </item>
</ripple>

<强> RES /动画/ lift_up.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
      android:state_enabled="true"
      android:state_pressed="true">
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="translationZ"
        android:valueTo="48dp"/>
  </item>
  <item>
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="translationZ"
        android:valueTo="0dp"/>
  </item>
</selector>