이미지 뷰가 있습니다. 너비를 fill_parent로 설정하고 싶습니다. 높이가 너비가 무엇이든 되길 원합니다. 예를 들면 다음과 같습니다.
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
내 자신의 뷰 클래스를 만들지 않고도 레이아웃 파일에서 이와 같은 것이 가능합니까?
감사
답변
업데이트 : 2017 년 9 월 14 일
아래 의견에 따르면 퍼센트 지원 라이브러리는 Android 지원 라이브러리 26.0.0부터 더 이상 사용되지 않습니다. 이것이 새로운 방법입니다.
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1" />
</android.support.constraint.ConstraintLayout>
더 이상 사용되지 않음 :
Android Developers 의이 게시물 에 따르면 이제 PercentRelativeLayout 또는 PercentFrameLayout 내에서 원하는 것을 랩핑 한 다음 비율을 지정하면됩니다.
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
app:layout_widthPercent="100%"
app:layout_aspectRatio="100%"/>
</android.support.percent.PercentRelativeLayout>
답변
아마도 이것은 당신의 질문에 대답 할 것입니다 :
<ImageView
android:id="@+id/cover_image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
scaleType
이 특정 상황에 대한 속성을 무시할 수 있습니다 .
답변
런타임에 Views 너비를 알면 LayoutParams를 사용하여 Views 높이를 동적으로 설정할 수 있습니다. 런타임에 뷰 너비를 얻으려면 Runnable 스레드를 사용해야합니다. 그렇지 않으면 레이아웃이 아직 그려지지 않았기 때문에 뷰의 너비를 알기 전에 높이를 설정하려고합니다.
내 문제를 해결 한 방법의 예 :
final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_id);
mFrame.post(new Runnable() {
@Override
public void run() {
RelativeLayout.LayoutParams mParams;
mParams = (RelativeLayout.LayoutParams) mFrame.getLayoutParams();
mParams.height = mFrame.getWidth();
mFrame.setLayoutParams(mParams);
mFrame.postInvalidate();
}
});
LayoutParams는보기가있는 부모보기 유형이어야합니다. 내 FrameLayout은 xml 파일의 RelativeLayout 안에 있습니다.
mFrame.postInvalidate();
UI 스레드와 다른 스레드에있는 동안보기를 다시 그리도록 호출됩니다.
답변
RecyclerView 항목에 대한 David Chu의 대답 을 얻지 못하고 ImageView를 부모에게 제한해야한다고 생각했습니다. ImageView 너비를로 설정 0dp
하고 시작 및 끝을 부모로 제한하십시오. 너비를 설정 wrap_content
하거나 match_parent
일부 경우 작동 하는지 확실하지 않지만 ConstraintLayout의 자식이 부모를 채우는 더 좋은 방법이라고 생각합니다.
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="1:1"/>
</android.support.constraint.ConstraintLayout>
답변
여기에 너비가 항상 높이와 같은 ImageButton을 사용하여 수행 한 것은 (한 방향으로 바보 같은 빈 여백을 피하십시오 … SDK의 버그로 간주합니다 …) :
ImageButton에서 확장되는 SquareImageButton 클래스를 정의했습니다.
package com.myproject;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageButton;
public class SquareImageButton extends ImageButton {
public SquareImageButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public SquareImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public SquareImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
int squareDim = 1000000000;
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int h = this.getMeasuredHeight();
int w = this.getMeasuredWidth();
int curSquareDim = Math.min(w, h);
// Inside a viewholder or other grid element,
// with dynamically added content that is not in the XML,
// height may be 0.
// In that case, use the other dimension.
if (curSquareDim == 0)
curSquareDim = Math.max(w, h);
if(curSquareDim < squareDim)
{
squareDim = curSquareDim;
}
Log.d("MyApp", "h "+h+"w "+w+"squareDim "+squareDim);
setMeasuredDimension(squareDim, squareDim);
}
}
내 XML은 다음과 같습니다.
<com.myproject.SquareImageButton
android:id="@+id/speakButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="centerInside"
android:src="@drawable/icon_rounded_no_shadow_144px"
android:background="#00ff00"
android:layout_alignTop="@+id/searchEditText"
android:layout_alignBottom="@+id/searchEditText"
android:layout_alignParentLeft="true"
/>
매력처럼 작동합니다!
답변
Android 26.0.0에서는 PercentRelativeLayout이 더 이상 사용되지 않습니다. .
이를 해결하는 가장 좋은 방법은 ConstraintLayout
다음과 같습니다.
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView android:layout_width="match_parent"
android:layout_height="0dp"
android:scaleType="centerCrop"
android:src="@drawable/you_image"
app:layout_constraintDimensionRatio="1:1"/>
</android.support.constraint.ConstraintLayout>
다음은 프로젝트 에 추가하는 방법에 대한 자습서 입니다 ConstraintLayout
.
답변
이미지 뷰가 구속 조건 레이아웃 내에있는 경우 다음 구속 조건을 사용하여 정사각형 이미지 뷰를 작성할 수 있습니다.
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/ivImageView"
app:layout_constraintDimensionRatio="W,1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>