仅对 ImageView 的“src”alpha 属性而不是整个视图进行动画处理
Posted
技术标签:
【中文标题】仅对 ImageView 的“src”alpha 属性而不是整个视图进行动画处理【英文标题】:Animate only the "src" alpha attribute of ImageView instead of the entire view 【发布时间】:2014-07-12 23:09:53 【问题描述】:我有一个 ImageView,最初是空的。它的背景设置为灰色:
<ImageView
android:background="#333" />
从互联网上获取它的位图后,我想将它设置为 src 属性,但要优雅地淡入它。我看到的动画示例是这样的:
// fade_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:duration="2000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>
但这会为整个 ImageView 的不透明度设置动画。它具有在淡入之前先隐藏 ImageView 的效果,因此您会在动画开始时看到一个小弹出,即最初设置为 alpha=0 的视图。
有没有办法只为“src”属性而不是整个 ImageView 的不透明度设置动画?
谢谢
【问题讨论】:
【参考方案1】:imageView 的源图像上的动画很棘手,在大多数情况下需要将 imageView 包装到某个 ViewGroup 中,但如果您只想为其 alpha 设置动画(淡入/淡出),使用 TransitionDrawable 很容易:
TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]
new ColorDrawable(Color.TRANSPARENT),
getResources().getDrawable(R.drawable.my_image)
);
imageview.setImageDrawable(transitionDrawable);
transitionDrawable.startTransition(300);
【讨论】:
感谢这段代码,我想做一个简单的图像淡入,保持它的背景颜色。由于“getResources().getDrawable(R.drawable.my_image)”已被贬低,我将其替换为 -->“ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)” 并且效果很好!【参考方案2】:将ImageView
包裹在ViewGroup
中,例如LinearLayout
,这将是wrap_content
,并包含您希望保持可见的所有设置,例如背景颜色。像这样的:
<LinearLayout
android:layout_width='wrap_content'
android:layout_height='wrap_content'
android:background='#ff0000'>
<ImageView src='@drawable/ic_launcher'
android:layout_width='wrap_content'
android:layout_height='wrap_content'/>
</LinearLayout>
这将导致以下结果,alpha
分别为 0.5 和 1。
【讨论】:
【参考方案3】:你有两个选择:
1) 将透明的ImageView
放入灰色容器中(简单)。最简单的容器是FrameLayout
。
2) 使用ImageView.setAlpha(int)
方法对包含图像的 alpha 进行动画处理。该方法采用整数作为参数,范围从 0(完全透明)到 255(完全不透明)。要为这样的自定义属性设置动画,您需要使用 ObjectAnimator
或 NineOldAndroids。
【讨论】:
以上是关于仅对 ImageView 的“src”alpha 属性而不是整个视图进行动画处理的主要内容,如果未能解决你的问题,请参考以下文章