Android ViewのonMeasure()メソッドの詳細


onMeasure()メソッドはどこですか?何の役に立つの?疑問に思う人もいるかもしれませんが、ここでは、筆者の前の記事の例を検討してみましょう.onMeasureメソッドに簡単に触れて、正方形View:Androidで正方形Viewを実現します.
  • onMeasure()メソッドはどこですか?何の役に立つの?
  • void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
    /* 1.       ?  :     ,  class View     ,    ,              2.     ?  :Measure the view and its content to determine the measured width and the measured height. (        ,               。) */
  • onMeasure()メソッドはどのような場合に使用しますか?どう使いますか.

  • その前に、この方法は開発時に呼び出されたことがないのではないかという疑問を理解する必要があります.このメソッドはいつ呼び出されますか?筆者の開発経験から,「on」の単語で始まる方法は,いつコールバックされるか,すなわちシステムがいつ自動的に呼び出されるかである.これを知っていればいいのですが、いつ呼び出すか気にしないで、手を出すべき時に手を出すのです.
    -この方法の2つのパラメータは何ですか.
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, widthMeasureSpec);
            /*         (         class MeasureSpec)*/
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            /*         (         class MeasureSpec)*/
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            /*       */
            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            /*       */
            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    }

    class MeasureSpec
  • MeasureSpec.UNSPECIAFIED筆者は経験不足で、開発中に何が起こるかはまだ発見されていない
  • MeasureSpec.EXACTLY(正確寸法)レイアウト時layout_width、layout_heightはfill_parent、macth_parentの場合、この値は、サブviewが残りの容器の空間を占めるため、
  • のサイズが決定されます.
  • MeasureSpec.AT_MOST(最大サイズ)レイアウト時layout_width、layout_Heightが特定の値の場合、この値は、Viewの幅または高さを決定したため、その最大サイズは
  • の値です.
    Public Methods
    //*               ,             */
    static int getMode(int measureSpec);
    /*             */
    static int getSize(int measureSpec);
    /*         size   mode          */
    static int makeMeasureSpec(int size, int mode);

    シナリオ要件
    高さが幅の半分に等しくなるようにViewを実装し、キーコードを直接オンにします.
    アイデア1:onMeasureメソッドでMeasureSpec.getSize(int measureSpec)メソッドは幅の寸法widthを取得し、取得幅値width/2で高さ値heightを算出し、setMeasuredDimension(measuredWidth,measuredHeight)実装を呼び出す
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightSize = widthSize/2;
            setMeasuredDimension(widthSize,heightSize);
    }

    アイデア2:onMeasureメソッドでMeasureSpec.getSize(int measureSpec)メソッドとMeasureSpec.getMode(int measureSpec)メソッドは、幅の寸法widthと幅のパターンmodeを取得する、取得幅値width/2で高さ値heightを算出し、MeasureSpecを呼び出す.makeMeasureSpec(int size,int mode)法は、算出する高さheightと取得したモードmodeとをそれぞれ1つの測定空間データheightMeasureSpecに伝達し、この値は実際には私たちが必要とする高さ測定空間値であり、superを呼び出す.onMeasure(widthMeasureSpec,widthMeasureSpec)実装
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int height = widthSize / 2;
            int heightMode = MeasureSpec.getMode(widthMeasureSpec);
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, heightMode);
            super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    }

    2つの方法の違いは何ですか.<筆者のおすすめ2>
    構想1:ViewGropには適用されず、ViewGropをカスタマイズしてonMeasure()メソッドを実現すると、サブViewは表示できず、読者は試してみることができる.TextViewなどのコントロールをカスタマイズすると、割合は私たちのニーズを満たす可能性がありますが、サイズは私たちの想像を超える可能性があります.読者は試してみることができます.考え方2:考え方1の現象は現れません.私たちは新しい測定空間を作成して親に再伝達するだけで、すべての計算方法は変わっていません.だから、この方法は通じています.
    シナリオジョブ
    ひとつのTextViewをカスタマイズして、幅を実現するのは父の容器の幅の半分で、高さは幅の半分PSです:本文がみんなを助けることができることを望んで、疑問があったら伝言を残して返事を待つことができます