このLinearLayout内にLinearLayoutとImageViewがあります。
ImageViewには翻訳効果があります。
// v = ImageView
ObjectAnimator animation2 = ObjectAnimator.ofFloat(v, "translationY", 200);
animation2.setDuration(3000);
animation2.setTarget(v);
animation2.start();
アニメーションは動作しますが、ImageViewがLinearLayoutの外に出ると消えます。
ここで問題を確認できます。 http://screenr.com/zoAH
LinearLayoutの高さを変更せずに修正するにはどうすればよいですか。
ImageViewが属するViewGroupを見つけて適用します ViewGroup.setClipChildren(false) 。デフォルトでは、子の描画は親ViewGroupの境界に制限されます。
これを引き起こす可能性のある2つの属性があります:clipChildrenとclipToPadding。オブジェクトの境界がアニメーション化される親ViewGroupごとに、clipChildrenをfalseに設定する必要があります。また、clipToPaddingを直接の親に設定する必要があります(さらにそれ以上の場合もありますが、まだそのケースを見ていません)。
XMLで両方の属性を設定できます
Android:clipChildren="false"
Android:clipToPadding="false"
またはコード内
viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);
私の実装。おそらく誰かを助けることができます:
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)
ビューの高さを取得し、スライドする場所に高さの割合を追加します
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);
}
私の場合、clipChildrenはclipToPadding="false"
問題を修正しました。図を移動します。
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();