0

私は、カスタムの幅と高さを渡して、android.widget.FrameLayoutを拡張し、onMeasureメソッドをオーバーライドしてカスタムMySquareFrameクラスを作成しようとしました。スクエアフレームレイアウトの作成方法

public class MySquareFrame extends FrameLayout { 

public MySquareFrame(Context context) { 
    super(context); 
} 

public MySquareFrame(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MySquareFrame(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
public MySquareFrame(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int width = MeasureSpec.getSize(widthMeasureSpec); 
    int height = MeasureSpec.getSize(heightMeasureSpec); 
    int size = width > height ? height : width; 
    setMeasuredDimension(size, size); 
} 
} 

この

<com.example.akash.view.MySquareFrame 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/background3"> 
<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/fuel_meter" 
    android:rotation="120" 
    /> 
<com.triggertrap.seekarc.SeekArc 
    android:id="@+id/seekArc" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    seekarc:max="120" 
    android:padding="70dp" 
    seekarc:rotation="180" 
    seekarc:startAngle="30" 
    seekarc:sweepAngle="300" 
    seekarc:touchInside="false" 
    seekarc:clockwise="false" 
    seekarc:thumb="@drawable/nob" /> 
</com.example.akash.view.MySquareFrame> 

と私はだから私はMySquareFrameクラスはXMLで広場を見てみたい Landscape view

を得るようにXMLでこれを使用していました。助けてください..

-------------------- UPDATED --------------------- ----

DisplayMetrics displaymetrics = new DisplayMetrics(); 
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int height = displaymetrics.heightPixels; 
    int width = displaymetrics.widthPixels; 
    int size = width > height ? height : width; 
    setMeasuredDimension(size, size); 

これは、画面の大きさに応じて正方形のフレームを取得するのに役立ちました。

+0

用表示メトリクスそれは正方形の – SaravInfern

+0

Yが表示されるように、ディスプレイの幅を取得し、コード内の幅と同じ高さを設定します感謝します。出来た。 –

+0

コードを更新して「更新済み」と表示すると、他の人に役立つでしょう – SaravInfern

答えて

0

SquareLayoutAndroidライブラリさまざまなレイアウトのラッパークラスを提供し、コアの機能を失うことなくサイズを2乗して表示します。

の寸法は、レイアウトがレンダリングされる直前に計算されます。したがって、ビューが取得されると調整するための再レンダリングなどはありません。

あなたのbuild.gradleにこれを追加し、ライブラリを使用する:

repositories { 
    maven { 
     url "https://maven.google.com" 
    } 
} 

dependencies { 
    compile 'com.github.kaushikthedeveloper:squarelayout:0.0.3' 
} 
0

あなたはAndroidの開発者のWebサイトからSquareFrameLayoutの実装を見ることができます:

  

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     final int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
     final int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

     if (widthSize == 0 && heightSize == 0) { 
      // If there are no constraints on size, let FrameLayout measure 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

      // Now use the smallest of the measured dimensions for both dimensions 
      final int minSize = Math.min(getMeasuredWidth(), getMeasuredHeight()); 
      setMeasuredDimension(minSize, minSize); 
      return; 
     } 

     final int size; 
     if (widthSize == 0 || heightSize == 0) { 
      // If one of the dimensions has no restriction on size, set both dimensions to be the 
      // on that does 
      size = Math.max(widthSize, heightSize); 
     } else { 
      // Both dimensions have restrictions on size, set both dimensions to be the 
      // smallest of the two 
      size = Math.min(widthSize, heightSize); 
     } 

     final int newMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); 
     super.onMeasure(newMeasureSpec, newMeasureSpec); 
    } 
 
0

私は減少し、「多くのを見つけました"これのための解決策。次のように独自のOneOneFrameLayoutを作成して、ちょうどあなたのXMLにこのでframeLayoutを追加します。

public class OneOneFrameLayout extends FrameLayout { 

public OneOneFrameLayout(@NonNull Context context) { 
    super(context); 
} 

public OneOneFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) { 
    super(context, attrs); 
} 

public OneOneFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

public OneOneFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int snHeight = MeasureSpec.getSize(widthMeasureSpec); 
    int snHeightSpec = MeasureSpec.makeMeasureSpec(snHeight, MeasureSpec.EXACTLY); 
    super.onMeasure(widthMeasureSpec, snHeightSpec); 
} 
} 
関連する問題