Mam GridView
. Dane GridView
są żądaniem z serwera.
Oto układ przedmiotu w GridView
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/analysis_micon_bg"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="@dimen/half_activity_vertical_margin"
android:paddingLeft="@dimen/half_activity_horizontal_margin"
android:paddingRight="@dimen/half_activity_horizontal_margin"
android:paddingTop="@dimen/half_activity_vertical_margin" >
<ImageView
android:id="@+id/ranking_prod_pic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/ranking_rank_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ranking_prod_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ranking_prod_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Proszę o dane z serwera, pobieram adres URL obrazu i ładuję obraz do Bitmap
public static Bitmap loadBitmapFromInputStream(InputStream is) {
return BitmapFactory.decodeStream(is);
}
public static Bitmap loadBitmapFromHttpUrl(String url) {
try {
return loadBitmapFromInputStream((InputStream) (new URL(url).getContent()));
} catch (Exception e) {
Log.e(TAG, e.getMessage());
return null;
}
}
i jest kod getView(int position, View convertView, ViewGroup parent)
metody w adapterze
Bitmap bitmap = BitmapUtil.loadBitmapFromHttpUrl(product.getHttpUrl());
prodImg.setImageBitmap(bitmap);
Rozmiar obrazu to 210*210
. Uruchamiam aplikację na moim Nexusie 4. Obraz wypełnia ImageView
szerokość, ale ImageView
wysokość nie jest skalowana. ImageView
nie pokazuje całego obrazu.
Jak rozwiązać ten problem?
fill_parent
dla szerokości jest tylko dobrą praktyką, działa również ustalony rozmiar.Lubię odpowiedź arnefma, ale popełnił mały błąd (patrz komentarze), który postaram się poprawić:
W ten sposób
ImageView
zostanie odpowiednio skalowane i nie będzie mieć problemów z wymiarami, jeśli (na przykład) zostanie włożonyScrollView
źródło
there
jest linkMiałem kiedyś podobny problem. Rozwiązałem to, tworząc niestandardowy ImageView.
Następnie zastąp metodę onMeasure widoku obrazu. Zrobiłem coś takiego, jak sądzę:
Spowoduje to rozciągnięcie obrazu w celu dopasowania do ekranu przy zachowaniu współczynnika proporcji.
źródło
android:layout_height="wrap_content"
. W tym przypadkuMeasureSpec.getSize(heightMeasureSpec)
będzie,0
a twójviewSideRatio
spowodujeInfinity
(nie trzeba się zastanawiać, Java float dopuszcza takie wartości.) W tym przypadku zarówno twój, jakheight
iwidth
będzie0
.Zastosowanie
android:scaleType="centerCrop"
.źródło
Zrobiłem coś podobnego do powyższego, a następnie uderzyłem głową o ścianę przez kilka godzin, ponieważ to nie działało w środku
RelativeLayout
. Skończyło się na następującym kodzie:Aby zapobiec
RelativeLayout
ignorowaniu mierzonego wymiaru, zrobiłem to:źródło
Użyj tych właściwości w ImageView, aby zachować proporcje:
źródło
Nie będzie to miało zastosowania, jeśli ustawisz obraz jako tło w ImageView, musisz ustawić w src (android: src).
Dzięki.
źródło
Aby utworzyć obraz o szerokości równej szerokości ekranu i wysokości proporcjonalnie ustawionej zgodnie z proporcjami obrazu, wykonaj następujące czynności.
Mam nadzieję że to pomoże.
źródło
Spróbuj tego: to rozwiązało problem
źródło
Nie potrzebujesz kodu Java. Ty po prostu musisz :
Klucz znajduje się w rodzicu dopasowania dla szerokości i wysokości
źródło
wypróbuj tę prostą linię ... dodaj tę linię do kodu xml w tagu widoku obrazu bez dodawania jakiejkolwiek zależności android: scaleType = "fitXY"
źródło
użyj Androida: ScaleType = "fitXY" im ImageView xml
źródło
Możesz spróbować zrobić to, co robisz, ręcznie ładując obrazy, ale bardzo zdecydowanie zaleciłbym spojrzenie na Universal Image Loader .
Niedawno zintegrowałem go z moim projektem i muszę powiedzieć, że jest fantastyczny. Czy martwi Cię tworzenie asynchronicznych, zmienianie rozmiaru, buforowanie obrazów dla Ciebie. Naprawdę łatwo go zintegrować i skonfigurować. W ciągu 5 minut możesz prawdopodobnie zrobić to, co chcesz.
Przykładowy kod:
To może leniwie ładować obrazy, dopasować je poprawnie do rozmiaru imageView pokazując obraz zastępczy podczas ładowania i pokazując domyślną ikonę, jeśli ładowanie się nie powiedzie i buforowanie zasobów.
- Powinienem również dodać, że ta bieżąca konfiguracja zachowuje proporcje obrazu, dlatego ma zastosowanie do twojego pierwotnego pytania
źródło
Wystarczy użyć UniversalImageLoader i ustawić
i brak ustawień skali w ImageView
źródło
Miałem podobny problem, znalazłem przyczynę tego, ponieważ musisz obliczyć
dp
. Android studio obliczaniaImageView
podczas ładowania go zdrawable
, ale jeśli używasz innej metody, jak załadunek z bitmapydp
nie jest automatycznie rozliczane,Oto mój xml
Używam Kotlina i ładuję pliki do pobrania z pliku zasobów, oto jak to obliczam
źródło
Użyj Picasso, który jest łatwy w użyciu ..
W twoim adapterze ..
http://square.github.io/picasso/
źródło