2016-06-01 10 views
2

Androidでは、カスタムレイアウトを作成しています。それは私が配置、回転、そして正確に測定する必要があるビューを含んでいます。View.setX()、View.setRotation()、View.getWidth()はどのように相対的に動作しますか?

右に10ピクセル、下に10ピクセル、次に45度回転した10x10ピクセルのビューがある場合、ビューの測定自体はどのくらい広がり、正確にその位置が決まりますか?

view.setX(10) 
view.setY(10) 
view.setRotation(45) 
view.measure(widthSpec, heightSpec) 

それでも10pxを幅として報告するのか、それともローテーションを考慮に入れますか? x座標とy座標が回転したコーナーに揃っているのか、それとも固定されていますか?

答えて

2

rotationtranslationXtranslationYtranslationZscaleXscaleY - これらは、キャンバス属性です。つまり、の後にビューを描画する場所をAndroidに指示し、ビューのxyの位置に相対的に測定して配置します。これらの属性はデフォルトの測定ルーチンには影響しません(カスタムビューでonMeasureを無効にして考慮する必要がありますが、これを考慮する必要はありません)。だから、これらの属性のいずれかを変更すると、ビューmeasurments

xyには影響しません - レイアウト属性です。これは、このビューの親がそれ自身に対して相対的な位置を決定するので、onLayoutが呼び出される前にこれらの値を設定すると、これらの値は親によってオーバーライドされます。onLayoutの後にxyを上書きすると、このビューの位置をその親内で変更できます。しかし、この結果を踏まえれば、次のonLayoutコールがxyを再びリセットするので、むしろtranslationXtranslationYという属性を使用することになります。

しかし、元の質問に答えるには - はい、その幅として10pxと報告します。属性上記のどれも実際にDaveが指摘したように、xyに関する私の元の文は、レイアウト時に上書きされているビュー

EDITの報告幅または高さに影響を与えないだろう本当に正しいではありません。設定xy属性は内部で `SETX()`と `setTranslationXは()`ビーイングのみが異なる、同じことを行うので、これらの属性を更新することは効果的に文書をよると、翻訳

+1

の更新と同じであり、translationXtranslationYを設定します相対的な絶対値:相対的な値:https://developer.android.com/reference/android/view/View.html#setX(float) –

+0

これは視覚的に**翻訳と同じことをしますが、答えは、これらの2つの間に概念的な違いがあります。 'x'と' y'を変更することは、次の 'onLayout'呼び出しまで有効です。レイアウトプロセス中に、親プロセスは 'x'と' y'を再計算するので、それらを再度更新する必要があります。 'translationX'と' translationY'はレイアウト全体で同じままです –

+0

Hmm。私は反対する必要があります。私はView.javaのソースをチェックし、 'setX()'は 'setTranlationX()'を直接呼び出します:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.java #L11802 –

関連する問題