ImageView가 동적 너비를 가진 정사각형입니까?
내부에 ImageView가있는 GridView가 있습니다. 각 행에 3 개가 있습니다. WRAP_CONTENT 및 scaleType = CENTER_CROP으로 너비를 올바르게 설정할 수 있지만 ImageView의 크기를 정사각형으로 설정하는 방법을 모르겠습니다. 지금까지 제가 한 작업은 "정적"인 높이를 제외하면 괜찮은 것 같습니다.
imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT, 300));
어댑터 내부에서하고 있습니다.
가장 좋은 옵션은 ImageView
측정 패스를 재정 의하여 자신 을 하위 클래스로 만드는 것입니다.
public class SquareImageView extends ImageView {
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
setMeasuredDimension(width, width);
}
...
}
다른 대답은 잘 작동합니다. 이것은 xml 부풀린 레이아웃과 관련하여 정사각형 너비와 높이로 ImageView를 만드는 bertucci 솔루션의 확장입니다.
다음과 같이 ImageView를 확장하는 SquareImageView와 같은 클래스를 만듭니다.
public class SquareImageView extends ImageView {
public SquareImageView(Context context) {
super(context);
}
public SquareImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
setMeasuredDimension(width, width);
}
}
이제 XML에서 다음을 수행하십시오.
<com.packagepath.tothis.SquareImageView
android:id="@+id/Imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
ImageView가 프로그램에서 동적으로 생성되지 않고 xml로 수정되어야하는 경우이 구현이 도움이 될 것입니다.
더 간단합니다.
public class SquareImageView extends ImageView {
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
}
이전 답변 중 몇 가지는 완벽하게 충분합니다. @Andro Selva와 @ a.bertucci의 솔루션 모두에 작은 최적화를 추가하고 있습니다.
작은 최적화이지만 너비와 높이가 다른지 확인하면 다른 측정 통과를 방지 할 수 있습니다.
public class SquareImageView extends ImageView {
public SquareImageView(Context context) {
super(context);
}
public SquareImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
// Optimization so we don't measure twice unless we need to
if (width != height) {
setMeasuredDimension(width, width);
}
}
}
Kotlin 솔루션을 찾는 사용자 :
class SquareImageView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0
) : ImageView(context, attrs, defStyleAttr, defStyleRes){
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) = super.onMeasure(widthMeasureSpec, widthMeasureSpec)
}
지정된 너비에 따른 squareImageView :
public class SquareImageViewByWidth extends AppCompatImageView {
public SquareImageViewByWidth(Context context) {
super(context);
}
public SquareImageViewByWidth(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageViewByWidth(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width= getMeasuredWidth();
setMeasuredDimension(width, width);
}
...
}
지정된 높이의 squareImageView :
public class SquareImageViewByHeight extends AppCompatImageView {
public SquareImageViewByHeight(Context context) {
super(context);
}
public SquareImageViewByHeight(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageViewByHeight(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = getMeasuredHeight();
setMeasuredDimension(height, height);
}
...
}
최소 차원의 squareImageView :
public class SquareImageViewByMin extends AppCompatImageView {
public SquareImageViewByHeight(Context context) {
super(context);
}
public SquareImageViewByHeight(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageViewByHeight(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int minSize = Math.min(width, height);
setMeasuredDimension(minSize, minSize);
}
...
}
누군가 뷰가 정사각형이 아니라 높이가 비례 적으로 크기 조정되기를 원하면 (예 : 16/9 또는 1/3) 다음과 같이 할 수 있습니다.
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth()/3, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
여기에서 모두 onMeasure
. 내 구현은 다음과 같습니다.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = Math.min(width, height);
setMeasuredDimension(size, size);
}
참고URL : https://stackoverflow.com/questions/16506275/imageview-be-a-square-with-dynamic-width
'Development Tip' 카테고리의 다른 글
Mac Spark-shell 오류 초기화 SparkContext (0) | 2020.10.30 |
---|---|
C / C ++에서 배열을 복사하는 기능이 있습니까? (0) | 2020.10.30 |
해시 특정 키를 제외하고 모두 제거 (0) | 2020.10.30 |
Sequelize, 엔티티를 일반 객체로 변환 (0) | 2020.10.30 |
라이브러리가로드되지 않음 : /usr/local/opt/readline/lib/libreadline.7.dylib (0) | 2020.10.30 |