如何根据屏幕尺寸改变imageview
How to change imageview according to screen size
我尝试将一个图像视图(个人资料图像)、2 个文本视图(用户名和电子邮件)添加到导航中 header。
这是导航的 xml 代码 header
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/header_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/sym_def_app_icon" />
<TextView
android:id="@+id/header_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/header_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
我通过 picasso 加载图像视图,这是我加载它的代码。
private void setNavHeader() {
User user = presenter.getUser();
username.setText(user.getUsername());
email.setText(user.getEmail());
try {
Picasso.with(this)
.load(user.getUserImage())
.error(R.drawable.ic_menu_camera)
.resize(200, 200)
.into(profileImage);
}catch(Exception e){
profileImage.setImageResource(R.drawable.ic_menu_camera);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(200, 200);
profileImage.setLayoutParams(layoutParams);
}
}
这是我的输出
但是,它只适合我的 phone 屏幕尺寸。当我将屏幕尺寸更改为较小的屏幕尺寸时。个人资料图片将覆盖用户名和电子邮件。如何根据屏幕大小更改个人资料图片的大小,这样就不会遮住用户名和电子邮件?
首先,移除try and catch。隐藏此错误并不好,只需检查可能的 url 问题并手动设置图像,就像在缓存块中一样。如果您使用 String 或 Uri,请检查用户图像 url 是否 为空 或 null。
重点是您使用的是 LinearLayout
,它会注意子视图不会重叠。如果您更改 ImageView
高度,您的 TextViews
可能会被切到底部,因为您的 android:layout_height="@dimen/nav_header_height"
值定义的 space 不够。
在 XML 中设置您想要的高度和宽度,例如:
<ImageView
android:id="@+id/header_image"
android:layout_width="100dp"
android:layout_height="100dp"
app:srcCompat="@android:drawable/sym_def_app_icon" />
只需找到您的正确尺寸/询问您的设计师(如果您与设计师合作)这张图片的合适尺寸是多少。这将更改 ImageView
的视图边界,显示的图像当然将取决于此大小。
你可以玩玩imageView的以下属性:
android:scaleType
android:adjustViewBounds
这会更改图像在 ImageView
范围内的显示方式。
使用 dp 而不是像素,这也需要注意,您的图像视图在不同的设备尺寸上得到很好的缩放。
您还可以使用 Picasso 函数,例如:
Picasso.with(this)
.load(user.getUserImage())
.error(R.drawable.ic_menu_camera)
.placeholder(...)
.resize(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) // <-- is needed for some functions
.fit()// <--
.centerCrop()// <--
.centerInside()// <--
.into(profileImage);
只需找到能为您提供最佳结果的函数即可。
我尝试将一个图像视图(个人资料图像)、2 个文本视图(用户名和电子邮件)添加到导航中 header。
这是导航的 xml 代码 header
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/header_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/sym_def_app_icon" />
<TextView
android:id="@+id/header_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/header_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
我通过 picasso 加载图像视图,这是我加载它的代码。
private void setNavHeader() {
User user = presenter.getUser();
username.setText(user.getUsername());
email.setText(user.getEmail());
try {
Picasso.with(this)
.load(user.getUserImage())
.error(R.drawable.ic_menu_camera)
.resize(200, 200)
.into(profileImage);
}catch(Exception e){
profileImage.setImageResource(R.drawable.ic_menu_camera);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(200, 200);
profileImage.setLayoutParams(layoutParams);
}
}
这是我的输出
首先,移除try and catch。隐藏此错误并不好,只需检查可能的 url 问题并手动设置图像,就像在缓存块中一样。如果您使用 String 或 Uri,请检查用户图像 url 是否 为空 或 null。
重点是您使用的是 LinearLayout
,它会注意子视图不会重叠。如果您更改 ImageView
高度,您的 TextViews
可能会被切到底部,因为您的 android:layout_height="@dimen/nav_header_height"
值定义的 space 不够。
在 XML 中设置您想要的高度和宽度,例如:
<ImageView
android:id="@+id/header_image"
android:layout_width="100dp"
android:layout_height="100dp"
app:srcCompat="@android:drawable/sym_def_app_icon" />
只需找到您的正确尺寸/询问您的设计师(如果您与设计师合作)这张图片的合适尺寸是多少。这将更改 ImageView
的视图边界,显示的图像当然将取决于此大小。
你可以玩玩imageView的以下属性:
android:scaleType
android:adjustViewBounds
这会更改图像在 ImageView
范围内的显示方式。
使用 dp 而不是像素,这也需要注意,您的图像视图在不同的设备尺寸上得到很好的缩放。
您还可以使用 Picasso 函数,例如:
Picasso.with(this)
.load(user.getUserImage())
.error(R.drawable.ic_menu_camera)
.placeholder(...)
.resize(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) // <-- is needed for some functions
.fit()// <--
.centerCrop()// <--
.centerInside()// <--
.into(profileImage);
只需找到能为您提供最佳结果的函数即可。