当我在 xml 中设置参数时,工作自定义视图不会改变(预览问题)

Working custom view not chaning when I set params in xml (preview issue)

我已经为 imageView 创建了工作自定义视图,以便能够根据显示屏尺寸按百分比缩小和放大。在 AndroidStudio 的预览选项卡中,我没有看到任何错误,预览工作正常。但是我的自定义视图没有改变。当我设置为 .1 总宽度的 10% 时,我的自定义视图在预览中没有改变。当我启动我的应用程序时,我的自定义视图运行良好。我不确定我做错了什么。我很乐意给小费。谢谢。

这是我的 xml 课程:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:src="@drawable/logo"
        android:layout_centerInParent="true" />

    <com.example.widgets.ImageViewWidthFix
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:src="@drawable/blue_logo"
        android:layout_centerInParent="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:percentageWidth=".3" />

</RelativeLayout>

这是我的 java 课程:

public class ImageViewWidthFix extends ImageView {
    private float percentageWidth;
    private float percentageHeight;

    public ImageViewWidthFix(Context context) {
        super(context);
        init(context, null);
    }

    public ImageViewWidthFix(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public ImageViewWidthFix(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ImageViewWidthFix(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        ViewGroup.LayoutParams layoutParams = getLayoutParams();
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        layoutParams.width = (int) (percentageWidth == 1 ? layoutParams.width : displayMetrics.widthPixels * percentageWidth);
        layoutParams.height = (int) (percentageHeight == 1 ? layoutParams.height : displayMetrics.heightPixels * percentageHeight);
        setLayoutParams(layoutParams);
        invalidate();

    }

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageViewFixedDimension);
            percentageWidth = a.getFloat(R.styleable.ImageViewFixedDimension_percentageWidth, 1);
            percentageHeight = a.getFloat(R.styleable.ImageViewFixedDimension_percentageHeight, 1);
            a.recycle();
        }
    }
}

您没有使用视图的新尺寸调用 setMeasuredDimension。那会引起问题。来自文档:

CONTRACT: When overriding this method, you must call setMeasuredDimension(int, int) to store the measured width and height of this view. Failure to do so will trigger an IllegalStateException, thrown by measure(int, int). Calling the superclass' onMeasure(int, int) is a valid use.

虽然您没有收到异常,因为超类正在调用它,但您也没有正确设置它们,这会导致其他地方出现问题。