3 回答
TA贡献1793条经验 获得超6个赞
最好的选择是继承ImageView自己的子类,以覆盖度量传递:
public class SquareImageView extends ImageView {
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
setMeasuredDimension(width, width);
}
...
}
TA贡献1785条经验 获得超4个赞
另一个答案很好。这只是bertucci解决方案的扩展,以使ImageView相对于xml膨胀版式具有正方形的宽度和高度。
创建一个类,说一个SquareImageView这样扩展ImageView,
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中进行固定,那么此实现将非常有用。
TA贡献1865条经验 获得超7个赞
前面的几个答案就足够了。我只是在这里为@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);
}
}
}
- 3 回答
- 0 关注
- 767 浏览
添加回答
举报