Toolbar中ImageView占用过多横向空间问题求助
问题分析与解决方案
这个问题我之前也碰到过,核心原因是你混淆了视图缩放(scaleX/Y)和布局测量尺寸的区别,再加上ImageView的属性设置没适配Toolbar的布局逻辑,导致它占用了过多横向空间。
为什么会出现这个问题?
- 你给ImageView设置了
android:layout_height="?attr/actionBarSize",但layout_width="wrap_content",而你的原图是256x256的高分辨率图片。ImageView默认会按照图片的原始尺寸进行布局测量,所以即使你用setScaleX(0.5f)和setScaleY(0.5f)把它视觉上缩小了,它实际占据的布局空间还是原图的宽度(256px对应的实际屏幕宽度)。 scaleX/Y只是对视图进行绘制上的缩放,不会改变View在布局中占用的空间大小,所以你会看到图片看起来小了,但它还是占了一大块横向位置。
解决方法
我们需要让ImageView的布局尺寸真正适配Toolbar的高度,同时保持图片的宽高比,而不是靠视觉缩放来“伪装”。
1. 修改Toolbar布局文件
给ImageView添加android:adjustViewBounds="true",并确保它的高度适配Toolbar,宽度自动按比例调整:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <ImageView android:id="@+id/dicebutton" android:layout_width="wrap_content" android:layout_height="match_parent" android:adjustViewBounds="true" android:contentDescription="dice" android:src="@drawable/dice_1" /> </android.support.v7.widget.Toolbar>
adjustViewBounds="true"会让ImageView根据图片的宽高比自动调整自身的宽度,保证图片不会被拉伸变形,同时不会超出设置的高度(这里是Toolbar的高度)。- 把
layout_height改成match_parent,让ImageView的高度完全适配Toolbar,宽度则按图片比例自动缩小。
2. 调整Activity中的代码
去掉setScaleX/Y的代码,因为现在布局已经正确适配了,不需要再做视觉缩放:
if (myToolbar != null) { setSupportActionBar(myToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setElevation(0); image = myToolbar.findViewById(R.id.dicebutton); if (image != null) { image.setImageResource(R.drawable.dice_1); // 移除这两行缩放代码 // image.setScaleX(0.5f); // image.setScaleY(0.5f); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rollDice(Helper.rand.nextInt(6) + 1, v); } }); } }
如果觉得图片还是太大,可以通过android:maxWidth给ImageView设置一个最大宽度限制,比如android:maxWidth="48dp",这样它的宽度不会超过这个值,同时保持宽高比。
内容的提问来源于stack exchange,提问作者DAVIDBALAS1
相关产品推荐
相关产品推荐

