#android
#Android
Вопрос:
Я пытался добиться ширины и высоты загрузки изображений в Facebook на основе ширины и высоты всего размера экрана на домашней странице.
Ниже я опубликовал код, который я пробовал до сих пор.
Я пробовал это двумя способами:
Первый способ:
home_activity_layout.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
>
<LinearLayout
android:id="@ id/rl_vertical_list"
android:visibility="visible"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@ id/post_items_layout_middle_home"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp" >
<com.steve.thirdparty.ScalableImageView
android:id="@ id/iv_posted_img_home"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_centerHorizontal="true"
android:src="@drawable/golive_load_image"
android:layout_below="@ id/tv_user_posted_msg_post_items_home"
android:contentDescription="@string/cont_desc"/>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
ScalableImageView.java:
public class ScalableImageView extends ImageView {
public ScalableImageView(Context context) {
super(context);
}
public ScalableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScalableImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Drawable d = getDrawable();
if (d != null) {
int w = MeasureSpec.getSize(widthMeasureSpec);
int h = w * d.getIntrinsicHeight() / d.getIntrinsicWidth();
Log.e("Width", "" w);
Log.e("Height", "" h);
setMeasuredDimension(w, h);
}
else super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Но я не получил ожидаемого результата для разных измерений image.it не будет превышать высоту для изображений с более высокой плотностью пикселей.
Второй способ:
Получите ширину и высоту экрана и выполните некоторые вычисления:
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float screenHeight= displayMetrics.heightPixels / displayMetrics.density;
float screenWidth = displayMetrics.widthPixels / displayMetrics.density;
if(ImageHeight > ImageWidth)
{
float scale = ImageWidth/ImageHeight
float screenWidth = 320 (for example)
float getHeight = screenWidth /scale
}
таким образом, изображения с высокой плотностью пикселей не отображаются на домашней странице.
Любой может мне помочь с этим.Спасибо.
Ответ №1:
Я решил эту проблему двумя способами :
Первый способ:
Я внес некоторые изменения в ImageView.Я удалил внешний класс для imageview.Использование imageview width
и height
перенос содержимого сделали вид изображения подходящим для всех устройств экрана adjustviewbounds
.
<ImageView
android:id="@ id/iv_posted_img_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitStart"
android:src="@drawable/load_image"
android:layout_below="@ id/tv_user_posted_msg_post_items_home"
android:contentDescription="@string/cont_desc"/>
Примечание: Использование width и height wrapcontent приведет к ошибке памяти.
Второй способ:
Это решение является самым безопасным решением, чтобы не превышать ошибку нехватки памяти.
В ответе json я получаю ширину и высоту изображения.Итак, я обрабатываю все изображения в адаптере, используя ширину и высоту.
Код адаптера:
if(rowItem.getWidthImage() != null){
if(rowItem.getWidthImage().equals(null) || rowItem.getWidthImage().equals("")){
Log.e("InvalidImage", "Test");
}else {
Log.e("imageWidth", "" rowItem.getWidthImage());
Log.e("imageHeight", "" rowItem.getHeightImage());
int imageWidth = Integer.parseInt(rowItem.getWidthImage());
int imageHeight = Integer.parseInt(rowItem.getHeightImage());
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = width * imageHeight / imageWidth;
params = new LinearLayout.LayoutParams(width, height);
holder.ivPostedImageNew.setLayoutParams(params);
holder.llPostedImage.addView(holder.ivPostedImageNew);
Glide.with(context).load(rowItem.getPosteduserpostimage()).placeholder(R.drawable.golive_load_image).error(R.drawable.bg_golive).into(holder.ivPostedImageNew);
}
}
Для получения более подробной информации: смотрите здесь