ImageView 扩展容器尽管 adjustViewBounds
ImageView expanding container despite adjustViewBounds
我想将 ImageView
包裹在 LinearLayout
中,以便我可以将一组视图居中。然而,原始图像需要按比例缩小以适应 ImageView
,并且原始尺寸会扩展 LinearLayout
,尽管我使用 adjustViewBounds="true"
和封闭的 FrameLayout
作为 questions 在 SO 上建议。
所需的布局应类似于 this、
但观察到的布局看起来像 this,
由下面的 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"
因为我需要相对于屏幕的高度。
我看到你添加了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"/>
您可以将最大宽度更改为您想要的任何数字。
您可以做的事情:
1) 为包含ImageView 的FrameLayout 设置特定的宽度/高度,并为ImageViwe 设置android:scaleType 为centerInside、fitCenter 或fitXY。
2) 以编程方式,在您的 activity 中,在 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;
}
}
备注:
宽度以像素表示。
要获取显示指标:
How to get screen display metrics in application class
要为 ImageView 建立相对宽度,获取显示器的宽度并计算所需的百分比作为图像的宽度。
根据 this 对另一个问题的回答,在保留图像的高度和纵横比的同时删除 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的 and these说明,下面的代码也达到了预期的效果:
@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);
}
我想将 ImageView
包裹在 LinearLayout
中,以便我可以将一组视图居中。然而,原始图像需要按比例缩小以适应 ImageView
,并且原始尺寸会扩展 LinearLayout
,尽管我使用 adjustViewBounds="true"
和封闭的 FrameLayout
作为
所需的布局应类似于 this、
但观察到的布局看起来像 this,
由下面的 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"
因为我需要相对于屏幕的高度。
我看到你添加了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"/>
您可以将最大宽度更改为您想要的任何数字。
您可以做的事情:
1) 为包含ImageView 的FrameLayout 设置特定的宽度/高度,并为ImageViwe 设置android:scaleType 为centerInside、fitCenter 或fitXY。
2) 以编程方式,在您的 activity 中,在 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;
}
}
备注: 宽度以像素表示。 要获取显示指标: How to get screen display metrics in application class
要为 ImageView 建立相对宽度,获取显示器的宽度并计算所需的百分比作为图像的宽度。
根据 this 对另一个问题的回答,在保留图像的高度和纵横比的同时删除 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);
}