Android:ViewのSizeをレイアウトに頼らない・・・onMeasure

Viewのサイズをレイアウトに頼りたくない時、レイアウトに頼れない時、
そんなときはonMeasureをオーバーライドしやがれ。

下記はButtonのサイズを100x100にするサンプル

Button btn = new Button( context ) {
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  
  // このようにして自身のサイズをコントロールできるぞ
  setMeasuredDimension( 100 , 100 );
 }
};

次は、親のレイアウト指定がWRAP_CONTENTだったら自分のサイズを主張する現実的なサンプル。
Button btn = new Button( context ) {
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
    float  density = getResources().getDisplayMetrics().density;
    
    int  hmode = MeasureSpec.getMode(heightMeasureSpec);
    int  wmode = MeasureSpec.getMode(widthMeasureSpec);
    
    int  hsize = MeasureSpec.getSize(heightMeasureSpec);
    int  wsize = MeasureSpec.getSize(widthMeasureSpec);
    
    // 高さを求める
    int  height = 0;
    if( hmode==MeasureSpec.EXACTLY ) {
      height = hsize;
    } else {
      height = (int)( 300f * density );
    }
    
    // 幅を求める
    int  width = 0;
    if( wmode==MeasureSpec.EXACTLY ) {
      width = wsize;
    } else {
      width = (int)( 300 * density );
    }
    
    setMeasuredDimension( width , height );
  }
}

カスタムView作成の基本だ

コメント

このブログの人気の投稿

nginxでlocalhostとしてアクセスをサーバーに転送する方法

Android・・・テキスト描画あれこれ, ascent(), descent()等

Android:stateに応じて切り替わるdrawable・・・StateListDrawable