アニメーション中に一部のビューのZオーダーを変更したい
4.1.2以上のAndroidでは問題なく動作し、4.1.2以下のAndroidではZオーダーが変更されないため、上面図が上に残ります。
これは私がしようとしていることです。
myView.bringToFront();
((View)myView.getParent()).invalidate();
古いデバイスで動作させるにはどうすればよいですか?
/**
* Change the view's z order in the tree, so it's on top of other sibling
* views. This ordering change may affect layout, if the parent container
* uses an order-dependent layout scheme (e.g., LinearLayout). Prior
* to {@link Android.os.Build.VERSION_CODES#KitKat} this
* method should be followed by calls to {@link #requestLayout()} and
* {@link View#invalidate()} on the view's parent to force the parent to redraw
* with the new child ordering.
*
* @see ViewGroup#bringChildToFront(View)
*/
public void bringToFront() {
if (mParent != null) {
mParent.bringChildToFront(this);
}
}
これによると、私は単に行を逃していた
((View)myView.getParent()).requestLayout();
そしてそれはうまくいった!
私はそれをすべて試しました。 RelativeLayoutはボタンの上にあるはずでしたが、ただ従いたくありませんでした。
最後に、RelativeLayoutにAndroid:elevation="2dp"
を追加して解決しました。
標高値は、APIレベル21以上でのみ使用されます。私の場合、APIレベル21以下はすべて問題なく、それ以上は問題ありませんでした。
これが誰かを助けるかもしれないことを願っています:)
これが誰かに役立つことを願っています。上記の解決策はどれも私にとってうまくいきませんでした。どうして?葉っぱになりたかった私のビューは他のビューより標高が小さかったからです。したがって、標高の高いビューは常に、正面にありました。
親ビューがrelativelayoutの場合、機能する場合と機能しない場合があります。 bringToFront
、requestLayout
、removeView; addView
を試しましたが、うまくいきませんでした。私の解決策は、すべてをフレームレイアウトの中に置くことでした。上に必要なのは、可視性を非表示にしてフレームレイアウトのボタンを移動し、コードで可視化したことです。
Apiの21以上の場合translateZ
と呼ばれるxml属性があり、ビューの標高レベルを定義できます。
あなたもそれをほとんど使うことができます。
Android:translateZ = "30dp"
* API> = 21