如何使来自 Internet 的图像在 Android 布局上响应?
How to make image from internet responsive on Android layout?
我的布局上有一个 Imageview,我用从网上下载的 .jpg 填充它。问题是我正在尝试使图像容器响应屏幕尺寸,因为在较大的手机中图像看起来很小。
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String imageUrl="https:url";
new DownloadImageTask((ImageView) findViewById(R.id.imvAd))
.execute(imageUrl);
}
}
我不想给出固定值。
任何关于查找内容的帮助或建议都很好
这是布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".startActivities.LoginActivity"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imvLogo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/logo"
tools:ignore="ContentDescription" />
<LinearLayout
android:id="@+id/lytProgressBarLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<ProgressBar
android:id="@+id/pgbLogin"
style="?android:attr/progressBarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/txtwelcome"
style="@style/styleTextview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/welcome" />
<EditText
android:id="@+id/edtPwdworker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/password"
android:inputType="numberPassword" />
<Button
android:id="@+id/btnLogin"
style="@style/styleButtonConsult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/login" />
</LinearLayout>
<TextView
android:id="@+id/txtInfoRoute"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_weight="90"
android:gravity="center" />
<TextView
android:id="@+id/txtPinDeviceLogin"
style="@style/styleTextviewsubTitlebold"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:gravity="center"
android:text="@string/pinDevice" />
<ImageView
android:id="@+id/imvAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="10dp"
tools:ignore="ContentDescription" />
</LinearLayout>
</ScrollView>
<TextView
android:id="@+id/txtVersionLogin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="95"
android:gravity="center" />
</LinearLayout>
如果您的 ImageView 是固定的,您可以通过将 ScaleType
设置为 CENTER_CROP
或其他相关缩放类型来缩放图像,使图像像您的 ImageView
那样缩放。
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop" />
也不要使用 wrap_content
,您可以使用 match_parent
来适应布局。
或使用 0dp
(在 ConstraintLayout
中)并将 ImageView 约束在其他两个视图之间。
但如果您希望 ImageView 的大小随屏幕大小而变化
您可以使用 Constraintlayout
作为父级并像这样使用 layout_constraintDimensionRatio
。
<androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1" />
</androidx.constraintlayout.widget.ConstraintLayout>
除此之外,我建议使用图像加载器库,例如 Glide。
这比自己加载图像更有效,而且您可以直接从那里设置缩放类型。
你可以使用glide
使用Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
可以调整图片大小
java:
Glide
.with(context)
.load(path)
.apply(new RequestOptions().override(600, 200))
.into(imageViewResizeCenterCrop);
xml :
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:weightSum="10"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="6"
android:weightSum="10"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="10dp"
android:layout_weight="2"/>
<ImageView
android:id="@+id/imvAd"
android:layout_width="0dp"
android:layout_weight="6"
android:layout_height="match_parent"
android:padding="10dp" />
<View
android:layout_width="0dp"
android:layout_height="10dp"
android:layout_weight="2"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"/>
</LinearLayout>
我的布局上有一个 Imageview,我用从网上下载的 .jpg 填充它。问题是我正在尝试使图像容器响应屏幕尺寸,因为在较大的手机中图像看起来很小。
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String imageUrl="https:url";
new DownloadImageTask((ImageView) findViewById(R.id.imvAd))
.execute(imageUrl);
}
}
我不想给出固定值。
任何关于查找内容的帮助或建议都很好
这是布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".startActivities.LoginActivity"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imvLogo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/logo"
tools:ignore="ContentDescription" />
<LinearLayout
android:id="@+id/lytProgressBarLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<ProgressBar
android:id="@+id/pgbLogin"
style="?android:attr/progressBarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/txtwelcome"
style="@style/styleTextview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/welcome" />
<EditText
android:id="@+id/edtPwdworker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/password"
android:inputType="numberPassword" />
<Button
android:id="@+id/btnLogin"
style="@style/styleButtonConsult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/login" />
</LinearLayout>
<TextView
android:id="@+id/txtInfoRoute"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_weight="90"
android:gravity="center" />
<TextView
android:id="@+id/txtPinDeviceLogin"
style="@style/styleTextviewsubTitlebold"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:gravity="center"
android:text="@string/pinDevice" />
<ImageView
android:id="@+id/imvAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="10dp"
tools:ignore="ContentDescription" />
</LinearLayout>
</ScrollView>
<TextView
android:id="@+id/txtVersionLogin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="95"
android:gravity="center" />
</LinearLayout>
如果您的 ImageView 是固定的,您可以通过将 ScaleType
设置为 CENTER_CROP
或其他相关缩放类型来缩放图像,使图像像您的 ImageView
那样缩放。
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop" />
也不要使用 wrap_content
,您可以使用 match_parent
来适应布局。
或使用 0dp
(在 ConstraintLayout
中)并将 ImageView 约束在其他两个视图之间。
但如果您希望 ImageView 的大小随屏幕大小而变化
您可以使用 Constraintlayout
作为父级并像这样使用 layout_constraintDimensionRatio
。
<androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1" />
</androidx.constraintlayout.widget.ConstraintLayout>
除此之外,我建议使用图像加载器库,例如 Glide。 这比自己加载图像更有效,而且您可以直接从那里设置缩放类型。
你可以使用glide
使用Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
可以调整图片大小 java:
Glide
.with(context)
.load(path)
.apply(new RequestOptions().override(600, 200))
.into(imageViewResizeCenterCrop);
xml :
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:weightSum="10"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="6"
android:weightSum="10"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="10dp"
android:layout_weight="2"/>
<ImageView
android:id="@+id/imvAd"
android:layout_width="0dp"
android:layout_weight="6"
android:layout_height="match_parent"
android:padding="10dp" />
<View
android:layout_width="0dp"
android:layout_height="10dp"
android:layout_weight="2"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"/>
</LinearLayout>