Android的requestLayout()是否适合布局动画?

maz*_*ork 7 android android-layout

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

我们用Adobe/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
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*zur 0

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

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

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

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