7

requestLayout()方法是在 Android 中创建动画布局的正确工具吗?

我们与 Adob​​e/Apache Flex 合作了几年,知道这两种方法invalidateProperties()commitProperties(). 似乎 Android 的requestLayout()用途layout()类似。但是文档提到有开销。

public class Paginator extends ViewGroup {
    private float animatedCurrentPage = 1;
    private final ObjectAnimator objectAnimator;

    public Paginator(Context context, AttributeSet attrs) {
        super(context, attrs);
        objectAnimator = ObjectAnimator.ofFloat(this, "animatedCurrentPage", 0f);
    }

    public void jumpToPage(int page) {
        objectAnimator.cancel();
        objectAnimator.setFloatValues(animatedCurrentPage, page);
        objectAnimator.start();
    }

    public void setAnimatedCurrentPage(float animatedCurrentPage) {
        this.animatedCurrentPage = animatedCurrentPage;
        requestLayout(); // <== queue an update of the layout
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // measure children here
    }

    @Override
    protected void onLayout(boolean changed, final int l, final int t, final int r, final int b) {
        // layout children here
    }
}
4

1 回答 1

0

我认为“invalidate()”应该通过调用而不是链接

通过遍历树并渲染与无效区域相交的每个视图来处理绘图。因为树是按顺序遍历的,这意味着父母将在他们的孩子之前(即之后)绘制,兄弟姐妹按照它们在树中出现的顺序绘制。如果您为 View 设置了背景可绘制对象,则 View 将在回调其 onDraw() 方法之前为您绘制它。

请注意,框架不会绘制不在无效区域中的视图。

要强制绘制视图,请调用 invalidate()。

于 2013-09-11T17:37:26.943 回答