1

我想把一个包裹在ImageView里面,LinearLayout这样我就可以集中一组视图。但是,原始图像需要按比例缩小以适合ImageView,并且原始大小会扩展LinearLayout,尽管我使用了adjustViewBounds="true"和 ,FrameLayout正如前面 关于 SO的问题所建议的那样。

所需的布局应如下所示

但观察到的布局看起来像这样

由以下 XML 生成:

<android.support.percent.PercentRelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="project.MainActivity">

        <LinearLayout
            android:layout_width="wrap_content"
            app:layout_heightPercent="32%"
            android:orientation="horizontal"
            android:background="#b44343"
            android:layout_centerHorizontal="true"
            android:layout_alignParentTop="true">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Sample Text"/>
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="#5555ae">
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:background="#2c8c4c"
                    android:src="@drawable/spades_icon"
                    android:adjustViewBounds="true"
                    android:scaleType="centerInside"/>
            </FrameLayout>
        </LinearLayout>
    </android.support.percent.PercentRelativeLayout>

我不能使用其他设置建议android:maxHeight="100dp",因为我需要高度相对于屏幕的高度。

4

3 回答 3

0

我看到你添加了android:adjustViewBounds="true".

您可以将其与android:maxWidth="60dp"

所以你的 imageView 应该是这样的。

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="#2c8c4c"
                android:src="@drawable/spades_icon"
                android:adjustViewBounds="true"
                android:maxWidth="60dp"
                android:scaleType="centerInside"/>

您可以将最大宽度更改为您想要的任何数字。

于 2017-05-14T14:52:36.917 回答
0

你可以做的事情:

1) 为包含 ImageView 的 FrameLayout 设置特定的宽度/高度,并将 ImageViwe 的 android:scaleType 设置为 centerInside、fitCenter 或 fitXY。

2) 以编程方式,在您的活动中,在 onCreate 之后,例如在 onResume 中,您可以获取 LayoutParams 并更改 ImageView 的宽度和高度,从而进行自己的缩放。当我在运行时根据屏幕宽度或高度进行缩放时,我会采用这种方法。

编辑 1

第二种选择的示例:

public class TestActivity extends AppCompatActivity {

    ImageView imgView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testactivity_layout);

        imgView = (ImageView) findViewById(R.id.imgview);

    }

    @Override
    protected void onResume() {
        super.onResume();
        ViewGroup.LayoutParams params = imgView.getLayoutParams();
        params.width = 100;
    }
}

注:宽度以像素表示。获取显示指标: 如何在应用程序类中获取屏幕显示指标

要为 ImageView 建立相对宽度,请获取显示的宽度并计算所需的百分比作为图像的宽度。

于 2017-05-14T15:06:43.963 回答
0

基于对另一个问题回答,LinearLayout在保留图像的高度和纵横比的同时删除空白的解决方案是:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    LinearLayout layout = (LinearLayout) findViewById(R.id.mLinearLayout);
    ImageView imageView = (ImageView) findViewById(R.id.mImageView);
    TextView textView = (TextView) findViewById(R.id.mTextView);

    layout.getLayoutParams().width = textView.getWidth()+imageView.getWidth();
    layout.requestLayout();
}

编辑:
根据@Juan 的回答这些说明,以下代码也达到了预期的效果:

@Override
protected void onResume() {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    this.getWindowManager()
        .getDefaultDisplay()
        .getMetrics(displayMetrics);

    ViewGroup.LayoutParams params = imgView.getLayoutParams();
    params.height = (int)Math.floor(displayMetrics.heightPixels * 0.32);
}
于 2017-05-14T18:49:05.180 回答