离开父母时Android视图消失
Posted
技术标签:
【中文标题】离开父母时Android视图消失【英文标题】:Android View Disappearing When Go Outside Of Parent 【发布时间】:2013-08-05 00:19:13 【问题描述】:我在这个 LinearLayout 中有一个 LinearLayout 和 ImageView。
ImageView有翻译效果。
// v = ImageView
ObjectAnimator animation2 = ObjectAnimator.ofFloat(v, "translationY", 200);
animation2.setDuration(3000);
animation2.setTarget(v);
animation2.start();
动画工作,但当 ImageView 超出 LinearLayout 时它消失了。
如何在不修改 LinearLayout 高度的情况下修复它。
【问题讨论】:
【参考方案1】:找到ImageView所属的ViewGroup并应用ViewGroup.setClipChildren(false)。 默认情况下,子项的绘制仅限于父 ViewGroup 的边界。
【讨论】:
在 XML 上设置 LinearLayout 的android:clipChildren="false"
但没有任何改变?
我已将 clipChildren="false"
设置为 ImageView 的所有父级(我的意思是 LinearLayout 的父级)。它正在工作。谢谢。
如果还没有向下滚动,请参阅下面 maxwell 的答案。也设置android:clipToPadding="false"
。
@Eray:我们可以处理对该 ImageView 的点击吗?
您可能不仅要为直接父 ViewGroup 设置剪辑子项,还需要为层次结构中的其他 ViewGroups 设置剪辑子项。【参考方案2】:
存在两个可能导致这种情况发生的属性:clipChildren 和clipToPadding。您需要将每个父 ViewGroup 的 clipChildren 设置为 false,对象将在其边界之外进行动画处理。您还需要将 clipToPadding 设置为直接父级(也许更多,但我还没有看到它的案例)。
您可以在 XML 中设置这两个属性
android:clipChildren="false"
android:clipToPadding="false"
或在代码中
viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);
【讨论】:
我个人也不得不将每个父母的 clipToPadding 设置为 false。很奇怪。Each parent ViewGroup
是关键!感谢您的回答。
这很有帮助。谢谢老哥!
完全正确! 1) 将 clipChildren
设置为 每个父 的 false
它的边界是视图。 2) 将clipToPadding
设置为false
用于直系父母。但正如我尝试的那样,RelativeLayout
仍然不起作用。见here。【参考方案3】:
我的实现。它可能可以帮助某人:
Java 版本:
public static void setAllParentsClip(View v, boolean enabled)
while (v.getParent() != null && v.getParent() instanceof ViewGroup)
ViewGroup viewGroup = (ViewGroup) v.getParent();
viewGroup.setClipChildren(enabled);
viewGroup.setClipToPadding(enabled);
v = viewGroup;
调用
setAllParentsClip(yourView, false);
禁用所有父母的剪辑。
已编辑:
作为扩展函数的 Kotlin 版本:
fun View.setAllParentsClip(enabled: Boolean)
var parent = parent
while (parent is ViewGroup)
parent.clipChildren = enabled
parent.clipToPadding = enabled
parent = parent.parent
电话:yourView.setAllParentsClip(false)
【讨论】:
您确定要应用 setAllParentsClip(yourView, false);到正确的观点?您确定您面临与所问问题相同的问题吗?很抱歉,我真的不知道为什么它不适合你?【参考方案4】:在我的例子中,clipChildren 除了 clipToPadding="false"
解决了这个问题之外什么也没做。去图吧。
【讨论】:
【参考方案5】:获取视图高度,然后将高度的百分比添加到它将滑动到的位置
public void SlideUp(View view)
float height = view.getHeight();
TranslateAnimation animate = new TranslateAnimation(0,0,0,0);
animate.setDuration(500);
animate.setFillAfter(true);
view.animate().translationY((float)(0-0.62*height)).start();
view.startAnimation(animate);
【讨论】:
【参考方案6】:try to update camera position as in my case below:
ValueAnimator lockAnimator = ValueAnimator.ofFloat(1, 0); // value from 0 to 1
lockAnimator.setDuration(500);
lockAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
@Override
public void onAnimationUpdate(ValueAnimator pAnimation)
float value = (Float) (pAnimation.getAnimatedValue());
if (value < .6 && flipped)
if (preview != null)
mCanvasImage.setImageBitmap(preview);
else
mCanvasImage.setImageBitmap(imageBitmap);
flipped = false;
if (value > .3 && value < .7)
lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() - 100);
else
lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() + 100);
lyt_rlt_container.setRotationY(180 * value);
);
lockAnimator.start();
【讨论】:
以上是关于离开父母时Android视图消失的主要内容,如果未能解决你的问题,请参考以下文章
在我的 android 应用程序中滚动列表视图时,数据正在消失。我在片段中使用列表视图
奇怪的列表视图项目选择器外观(手指离开屏幕时未移除按下状态)
Android Espresso - 嵌套父母的组合视图匹配器