Android:<include> 带有 RippleEffect 和 StateListAnimator
Android: <include> with RippleEffect & StateListAnimator
我有一个布局,其中包括另一个布局:
<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% 工作。我无法更改包含的布局。因此,我需要对包含标签或父布局本身进行效果处理的原因。
我已经尝试了这两种技术,none 其中成功了。
UPDATE
如果可能,这应该以编程方式关闭。
UPDATE 2
其次,,一旦它有动画?
您需要找到视图并调用适当的方法来更改状态列表动画器和背景。您可能还需要在包含布局的根视图上调用 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);
基于线程 Does Android XML Layout's 'include' Tag Really Work? and LayoutInflater.java 看来 <include>
标签只支持 android:id
、layout_*
和 android:visibility
属性。所以你设置 background
和 stateListAnimator
的代码没有效果。
解决 @Stepane 代码的以下问题:
your method enables the ripple effect properly, however the SLA isn't
fired. I cannot see any elevation taking place
如果膨胀的视图是透明的,则高度不可见,您必须设置 viewOutline
或使用一些 non-transparent 颜色让视图看到阴影。
摘自 ViewOutlineProvider documentation:
Interface by which a View builds its Outline, used for shadow casting
and clipping.
要设置 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/animator/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>
我有一个布局,其中包括另一个布局:
<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% 工作。我无法更改包含的布局。因此,我需要对包含标签或父布局本身进行效果处理的原因。
我已经尝试了这两种技术,none 其中成功了。
UPDATE
如果可能,这应该以编程方式关闭。
UPDATE 2
其次,
您需要找到视图并调用适当的方法来更改状态列表动画器和背景。您可能还需要在包含布局的根视图上调用 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);
基于线程 Does Android XML Layout's 'include' Tag Really Work? and LayoutInflater.java 看来 <include>
标签只支持 android:id
、layout_*
和 android:visibility
属性。所以你设置 background
和 stateListAnimator
的代码没有效果。
解决 @Stepane 代码的以下问题:
your method enables the ripple effect properly, however the SLA isn't fired. I cannot see any elevation taking place
如果膨胀的视图是透明的,则高度不可见,您必须设置 viewOutline
或使用一些 non-transparent 颜色让视图看到阴影。
摘自 ViewOutlineProvider documentation:
Interface by which a View builds its Outline, used for shadow casting and clipping.
要设置 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/animator/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>