반응형
부모의 높이와 피팅 너비를 조정하는 Android ImageView
업데이트 : 이 답변에 설명 된 방법을 사용하여이 문제를 해결했습니다.
이 문제는 꽤 간단해야한다고 생각합니다.
그래서 내 앱은 이미지를 다운로드하고 RelativeLayout의 자식 요소 인 ImageView에서 비트 맵을 렌더링합니다. ImageView를 부모 너비에 맞추고 가로 세로 비율을 유지하기 위해 크기를 조정하고 싶습니다.
내 XML은 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout android:id="@+id/banner" android:layout_width="fill_parent" android:layout_height="wrap_content"></RelativeLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
그리고 코드 :
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RelativeLayout banner = (RelativeLayout) findViewById(R.id.banner);
ImageView imgV = new ImageView(this);
imgV.setScaleType(ImageView.ScaleType.CENTER_CROP);
// I tried all the scale types : CENTER_INSIDE : same effect, FIT_CENTER : same effect...
imgV.setBackgroundColor(0x00FFFF00);
imgV.setAdjustViewBounds(Color.BLUE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
banner.addView(imgV,params);
// Some code downloading the image stream
bitmap = BitmapFactory.decodeStream(stream);
imgV.setImageBitmap(bitmap);
}
희망 :
결과 :
@Julien과 @js에게 감사드립니다. 다음은 비트 맵이 ImageView보다 작더라도 가로 세로 비율을 유지하면서 비트 맵 높이를 늘이는 ImageView의 완벽한 솔루션입니다.
public class ResizableImageView extends ImageView {
public ResizableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
Drawable d = getDrawable();
if(d!=null){
// ceil not round - avoid thin vertical gaps along the left/right edges
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
setMeasuredDimension(width, height);
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
ImageView 대신 XML 레이아웃에서이 클래스를 사용할 수 있습니다.
<com.example.ResizableImageView
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/banner" />
아마도 android:adjustViewBounds="true"
xml 또는 imageView.setAdjustViewBounds(true)
Java 에서 찾고있을 것입니다 .
코멘트에서 언급했듯이 ImageView를 서브 클래 싱했습니다. 내 코드를 찾았습니다. 여기 있습니다.
protected class ResizableImageView extends ImageView
{
private Bitmap mBitmap;
// Constructor
public ResizableImageView(Context context)
{
super(context);
}
// Overriden methods
@Override
protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
if(mBitmap != null)
{
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = width * mBitmap.getHeight() / mBitmap.getWidth();
setMeasuredDimension(width, height);
}
else
{
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
}
}
@Override
public void setImageBitmap(Bitmap bitmap)
{
mBitmap = bitmap;
super.setImageBitmap(bitmap);
}
}
imgV 너비를 "match_parent"로 변경해야한다고 생각합니다.
스케일 유형을 imgV.setScaleType (ImageView.ScaleType.CENTER_INSIDE)로 변경해야합니다.
이미지가 넓고 뷰의 경계도 넓어 질 수있는 경우를 고려하여 @Seraphim S의 솔루션을 약간 변경했습니다 (예 : 장치를 가로 모드로 회전).
public class ResizableImageView extends ImageView {
public ResizableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Drawable d = getDrawable();
if (d != null) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (width >= height) {
width = (int) Math.ceil((float) height * (float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight());
} else {
height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
}
setMeasuredDimension(width, height);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
반응형
'UFO ET IT' 카테고리의 다른 글
우분투 14.04에 최신 nodejs 버전 설치 (0) | 2020.11.25 |
---|---|
Android-세로 레이아웃 만 (0) | 2020.11.25 |
jquery를 사용하여 상단 위치를 설정하는 방법 (0) | 2020.11.25 |
C ++에서 float를 std :: string으로 변환 (0) | 2020.11.25 |
CouchDB와 RDBMS를 사용하는 경우 (0) | 2020.11.24 |