如何有条件地缩小一个视图或根据屏幕大小增长不同的视图?

时间:2017-08-23 19:42:08

标签: android android-layout

我正在尝试使用其中的两个视图布局活动,如下所示。

蓝色视图:此视图始终为方形。它的最大高度是窗口的宽度。如果需要,它可以缩小,但总是保持平方。

绿色视图:此视图具有最小高度,但没有最大值。如果包含的窗口非常高,则此视图的高度将会增加。

enter image description here

有没有人知道在android的xml布局中处理这个问题?我已尝试过layout_weights,但无法让它以两种方式工作(缩小和增长)。

如果有帮助,周围的ViewGroup是一个LinearLayout。

2 个答案:

答案 0 :(得分:0)

  

首先根据dp

获取屏幕宽度的值



Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;




  

然后将dp中显示宽度的相同值设置为布局的高度



LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(dpHeight, dpHeight);




  

无论设备屏幕如何,您都将拥有乡绅布局

     

这是实现布局最小高度的方法



SmartImageView siv = new SmartImageView(getActivity());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, minHeight);
siv.setLayoutParams(params);




答案 1 :(得分:0)

根据我收到的评论,我最终做了以下操作(针对我的解决方案稍作自定义,但包括代码,以防其他人帮助)。

在layout.xml中

<LinearLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <RelativeLayout
            android:id="@+id/blueWrapper"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <android.support.constraint.ConstraintLayout
                android:id="@+id/blueSquare"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <View
                    android:adjustViewBounds="true"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    app:layout_constraintBottom_toBottomOf="@id/blueSquare"
                    app:layout_constraintLeft_toLeftOf="@id/blueSquare"
                    app:layout_constraintRight_toRightOf="@id/blueSquare"
                    app:layout_constraintTop_toTopOf="@id/blueSquare"
                    app:layout_constraintDimensionRatio="w,1:1"/>

            </android.support.constraint.ConstraintLayout>

            <!--EXTRA ELEMENTS HERE-->

        </RelativeLayout>

        <!-- 100dp is the minHeight -->
        <RelativeLayout
            android:id="@+id/greenWrapper"
            android:layout_width="match_parent"
            android:layout_height="100dp" 
            android:background="@color/green" >

            <!--ELEMENTS HERE-->

        </RelativeLayout>
</LinearLayout>

在我的活动中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_activity);

    // Other initialization stuff here

    final LinearLayout root = (LinearLayout) findViewById(R.id.root);
    final RelativeLayout blueWrapper = (RelativeLayout) findViewById(R.id.blueWrapper);
    final View blueSquare = (View) findViewById(R.id.blueSquare);
    final RelativeLayout greenWrapper = (RelativeLayout) findViewById(R.id.greenWrapper);
    ViewTreeObserver vto = root.getViewTreeObserver();
    vto.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            root.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            int rootHeight = root.getHeight();

            if(blueWrapper.getHeight() > blueWrapper.getWidth()){
                ViewGroup.LayoutParams layoutParams = greenWrapper.getLayoutParams();
                layoutParams.height = rootHeight - blueSquare.getWidth();
                greenWrapper.setLayoutParams(layoutParams);
            }
        }
    });
}

这背后的逻辑是:

  • 在加载时,一切都会按预期工作,除非它是高大的窗户。

  • 对于高大的窗户,蓝色会拉伸到高度比宽度更大,便于识别。

  • 当发生这种情况时,只需计算blueHeight&amp; blueWidth&amp;将其添加到绿色包装的原始高度。