Android - 来自网络服务的图像在不同设备上有不同的大小
Android - Image coming from web service has different size on different devices
我知道有很多关于这个话题的问题。但我仍然需要帮助。我想证明我的 ImageView
在我的 TableLayout
中有相等的 width
和 height
。但是在不同的设备上我无法做到这一点。
这是我在 AsyncTask
中使用 URL
获取图像,并在 onPostExecute
方法上设置 ImageView
。
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) {
// set the imageview
bmImage.setImageBitmap(result);
}
这是我的 XML 文件 (news.xml),其中我的 ImageView 位于
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:paddingBottom="10dp"
android:id="@+id/mylayout"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:clickable="true"
android:background="@drawable/border"/>
<TextView
android:layout_width="match_parent"
android:layout_height="75dp"
android:maxLines="4"
android:id="@+id/text"
android:layout_below="@+id/image"
android:layout_alignEnd="@+id/image"
android:layout_alignRight="@+id/image"
android:clickable="true"
android:textSize="18sp"
android:background="#e3e3e3"
android:paddingTop="10dp"
android:gravity="center_vertical"
/>
</RelativeLayout>
我想我可以创建一个 TableLayout
,然后在 TableRow
之类的并排 2 视图中找到 View
(上图)。(视图在上图)
为此,我获取屏幕宽度并减去 paddings
并除以 2,然后将该宽度赋予 ImageView
以便能够为所有图像视图获得相同的尺寸。
这是我的代码,
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
tableLayout = (TableLayout) view.findViewById(R.id.tableLayout);
Log.e("screenwidth",":"+screenWidth);
// here is my paddings converted to pixel and will be subtracted from screen width
int pixValue = (int) (20 * Resources.getSystem().getDisplayMetrics().density);
int imageWidthPix = ( screenWidth - pixValue ) / 2;
Log.e("imageWidthPix ",":"+imageWidthPix );
for (int i = 0; i < categoryNews.get(myString).size(); i++) {
if (i % 2 == 0) {
tr = new TableRow(getActivity());
tableLayout.addView(tr);
}
//here is where my ImageView layout (news.xml)
View oneNews = inflater.inflate(R.layout.news, null);
ImageView imageView = (ImageView) oneNews.findViewById(R.id.image);
TextView textView = (TextView) oneNews.findViewById(R.id.text);
//here I set the width as I want
imageView.setLayoutParams(new RelativeLayout.LayoutParams(imageWidthPix, RelativeLayout.LayoutParams.WRAP_CONTENT));
String imagePath = "http://my.url.com/" + categoryNews.get(myString).get(i).getImagePath();
new DownloadImageTask(imageView,getActivity().getApplicationContext())
.execute(imagePath);
我在 phone 上得到了完美的结果。但是在屏幕尺寸不同的不同设备上,ImageView
顶部和底部都有空格。我尝试转换九个补丁块并将其再次转换为位图,但没有区别。如果我不会从网络服务中获取图像,我会将其他分辨率的图像放入 mipmap-hpdi
、mipmap-mdpi
等文件夹中,并且不会出现错误。但是我正在动态获取图像,所以如何实现 ImageView
有一半的屏幕宽度?
提前致谢。
这里我编辑了你的xml
尝试带权重的线性布局,根据需要更改权重,更改 layout_weight 以使图像视图和文本视图变小或变大。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:orientation="vertical"
android:id="@+id/mylayout"
android:weightSum="10">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:id="@+id/image"
android:src="@drawable/sd"
android:clickable="true"/>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:maxLines="4"
android:id="@+id/text"
android:clickable="true"
android:textSize="18sp"
android:background="#e3e3e3"
android:paddingTop="10dp"
android:gravity="center_vertical"
/>
</LinearLayout>
我知道有很多关于这个话题的问题。但我仍然需要帮助。我想证明我的 ImageView
在我的 TableLayout
中有相等的 width
和 height
。但是在不同的设备上我无法做到这一点。
这是我在 AsyncTask
中使用 URL
获取图像,并在 onPostExecute
方法上设置 ImageView
。
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) {
// set the imageview
bmImage.setImageBitmap(result);
}
这是我的 XML 文件 (news.xml),其中我的 ImageView 位于
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:paddingBottom="10dp"
android:id="@+id/mylayout"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:clickable="true"
android:background="@drawable/border"/>
<TextView
android:layout_width="match_parent"
android:layout_height="75dp"
android:maxLines="4"
android:id="@+id/text"
android:layout_below="@+id/image"
android:layout_alignEnd="@+id/image"
android:layout_alignRight="@+id/image"
android:clickable="true"
android:textSize="18sp"
android:background="#e3e3e3"
android:paddingTop="10dp"
android:gravity="center_vertical"
/>
</RelativeLayout>
我想我可以创建一个 TableLayout
,然后在 TableRow
之类的并排 2 视图中找到 View
(上图)。(视图在上图)
为此,我获取屏幕宽度并减去 paddings
并除以 2,然后将该宽度赋予 ImageView
以便能够为所有图像视图获得相同的尺寸。
这是我的代码,
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
tableLayout = (TableLayout) view.findViewById(R.id.tableLayout);
Log.e("screenwidth",":"+screenWidth);
// here is my paddings converted to pixel and will be subtracted from screen width
int pixValue = (int) (20 * Resources.getSystem().getDisplayMetrics().density);
int imageWidthPix = ( screenWidth - pixValue ) / 2;
Log.e("imageWidthPix ",":"+imageWidthPix );
for (int i = 0; i < categoryNews.get(myString).size(); i++) {
if (i % 2 == 0) {
tr = new TableRow(getActivity());
tableLayout.addView(tr);
}
//here is where my ImageView layout (news.xml)
View oneNews = inflater.inflate(R.layout.news, null);
ImageView imageView = (ImageView) oneNews.findViewById(R.id.image);
TextView textView = (TextView) oneNews.findViewById(R.id.text);
//here I set the width as I want
imageView.setLayoutParams(new RelativeLayout.LayoutParams(imageWidthPix, RelativeLayout.LayoutParams.WRAP_CONTENT));
String imagePath = "http://my.url.com/" + categoryNews.get(myString).get(i).getImagePath();
new DownloadImageTask(imageView,getActivity().getApplicationContext())
.execute(imagePath);
我在 phone 上得到了完美的结果。但是在屏幕尺寸不同的不同设备上,ImageView
顶部和底部都有空格。我尝试转换九个补丁块并将其再次转换为位图,但没有区别。如果我不会从网络服务中获取图像,我会将其他分辨率的图像放入 mipmap-hpdi
、mipmap-mdpi
等文件夹中,并且不会出现错误。但是我正在动态获取图像,所以如何实现 ImageView
有一半的屏幕宽度?
提前致谢。
这里我编辑了你的xml
尝试带权重的线性布局,根据需要更改权重,更改 layout_weight 以使图像视图和文本视图变小或变大。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:orientation="vertical"
android:id="@+id/mylayout"
android:weightSum="10">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:id="@+id/image"
android:src="@drawable/sd"
android:clickable="true"/>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:maxLines="4"
android:id="@+id/text"
android:clickable="true"
android:textSize="18sp"
android:background="#e3e3e3"
android:paddingTop="10dp"
android:gravity="center_vertical"
/>
</LinearLayout>