Dynamic View Size with Glide
Glide를 이용한 동적 뷰 크기 조절
이미지뷰의 경우 아래와 같이 adjustViewBounds 옵션만 주면 자동으로 width에 맞춰 비율을 유지한채 height값이 변하게 된다.
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true">
</ImageView>
Glide.with(mContext).load(IMAGE URL).into(IMAGEVIEW ID);
근데 ViewPager나 기타등등의 View들은 자동으로 안바뀌어서 이번에 프로젝트를 하며 하나 만들어놓았다.
- 스레드를 이용하여 서버에 있는 이미지 url에 접근한다. (여기서는 Glide가 알아서 해줌)
- 이미지의 높이(px), 너비(px)값을 변수로 가지고 있는다.
- layoutParams를 이용하여 View의 크기를 강제적으로 바꿔준다 이 때, ViewTreeObserver의 OnGlobalLayoutListener를 사용
- aHeight : aWidth = bHeight : bWidth 일 때, bHeight = (aHeight * bWidth) / aWidth 인 것을 적용한다.
xml
<!-- layout to apply margin -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<!-- dynamic size view -->
<include
android:id="@+id/ic_main_dynamic_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/include_main_marketing_banner">
</include>
</LinearLayout>
java
/**
* 이미지 사이즈에 맞춰 View의 높이를 이미지 크기에 맞게 자동으로 변경
* (View, LinearLayout 적용가능)
* @param context
* @param imageUrl
* @param view
*/
public static void setAutoSizeView(Context context, String imageUrl, View view) {
final View changeView = view;
// image url에 연결해서 이미지의 width, height를 받아온다.
Glide.with(context)
.load(imageUrl)
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable glideDrawable, GlideAnimation<? super GlideDrawable> glideAnimation) {
final int imageHeight = glideDrawable.getIntrinsicHeight();
final int imageWidth = glideDrawable.getIntrinsicWidth();
// 파라미터로 받아온 width, height를 view에 적용한다.
ViewTreeObserver vto = changeView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
changeView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = changeView.getMeasuredWidth();
int height = (width * imageHeight)/imageWidth;
changeView.setLayoutParams(new LinearLayout.LayoutParams(width, height));
}
});
}
});
}