3 animação de fragmento de layout de painel está gagueira

A informação de implementação: Eu implementei um layout de 3 painéis seguindo a resposta do CommonsWare postada em sua própria pergunta aqui:Amostra de trabalho completa do cenário de animação de três fragmentos do Gmail?

Como uma ideia geral, tenho o layout composto pelos seguintes níveis (1 a 3):

MainActivitySlidingMenu (Padrão de UI da gaveta lateral), o fragmento escondido no lado esquerdo eContentFragment como o fragmento que abriga o layout de 3 painéis.Dentro deContentFragment: LeftListFragment (linhas com 3 TextViews cada),MiddleListFragment (linhas com 8 TextViews cada),DetailFragment.

LeftListFragment eMiddleListFragment usarCursorLoaders para carregar dados de umContentProvider dentro de cada lista.DetailFragment também chama um cursor com dados quando necessário. Então eu nem implementei costumeAdapters (design muito melhor desta forma). Então eu adicionei o layout de 3 painéis + animações. Quanto ao trabalho, funciona como previsto, sem problemas.Animation o tempo é de 500 ms.

O problema: As animações gaguejam um pouco. Alguns quadros perdidos. Tanto quando a esquerda e o meio estão visíveis e eu clico em um item da lista do meio para abrir um detalhe; e também quando eu toco no botão Voltar para ver novamente as listas esquerda e média (quando nada está realmente carregando).

O que eu tentei:

Removido o código que carrega o fragmento emDetailView. Eu apenas toquei em um itemMiddleFragment e a animação começa, sem qualquer detalhe carregando de fato. Ainda gagueja. Além disso, quando voltando, nada carrega e ainda gagueja, então eu presumo que os carregadores / cursores não são a causa disso.Eu usei dumpsys gfxinfo para ver o tempo médio em ms para calcular cada quadro. De fato, o tempo médio para um cálculo é de 18 ms, que está acima do limite de 16 ms. Então, isso significa que a gagueira é por causa do tempo que leva para desenhar novamente as listas, ao animar? Se sim, porque? Quero dizer ... Eu não tenho imagens em todas as visualizações de linha. E eu não poderia estragar o código do Adaptador, porque eu não escrevi nada ...Reduzindo oAnimation tempo de 500ms a 200ms. Ainda gagueja se você assiste com muito cuidado, é apenas mais rápido.

EDITAR: Eu mudei derightPaneWidth paraleftPaneWidth abaixo (sim, isso remove a animação de redimensionamento) e a gagueira desapareceu. A lista ainda desliza para o lado esquerdo, mas não fica menor na largura. Então, se não há mais gagueira agora, isso significa que há um problema com o ObjectAnimator no meu código?

ObjectAnimator.ofInt(this, "middleWidth", rightPaneWidth, leftPaneWidth)
                    .setDuration(ANIM_DURATION).start();

Obrigado pelo seu tempo !

Código para Layout de 3 painéis:

package com.xyz.view.widget;

import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.widget.LinearLayout;


public class ThreePaneLayout extends LinearLayout
{
    private View leftView = null;
    private View middleView = null;
    private View rightView = null;

private static final int ANIM_DURATION = 500;
private int leftPaneWidth = -1;
private int rightPaneWidth = -1;


// -------------------------------------------------------------------------------------------
// --------------   Constructor
// -------------------------------------------------------------------------------------------


public ThreePaneLayout(Context context, AttributeSet attrs)
{
    super(context, attrs);
    setOrientation(HORIZONTAL);
}

@Override
public void onFinishInflate()
{
    super.onFinishInflate();
    leftView = getChildAt(0);
    middleView = getChildAt(1);
    rightView = getChildAt(2);
}


// -------------------------------------------------------------------------------------------
// --------------   Public methods
// -------------------------------------------------------------------------------------------


public View getLeftView()
{
    return leftView;
}

public View getMiddleView()
{
    return middleView;
}

public View getRightView()
{
    return rightView;
}

@SuppressLint("NewApi")
public void hideLeft()
{
    if (leftPaneWidth == -1)
    {

        leftPaneWidth = leftView.getWidth();
        rightPaneWidth = middleView.getWidth();
        resetWidget(leftView, leftPaneWidth);
        resetWidget(middleView, rightPaneWidth);
        resetWidget(rightView, rightPaneWidth);
        requestLayout();
    }
    translateWidgets(-1 * leftPaneWidth, leftView, middleView, rightView);
    ObjectAnimator.ofInt(this, "middleWidth", rightPaneWidth, leftPaneWidth)
                    .setDuration(ANIM_DURATION).start();
}

@SuppressLint("NewApi")
public void showLeft()
{
    translateWidgets(leftPaneWidth, leftView, middleView, rightView);
    ObjectAnimator.ofInt(this, "middleWidth", leftPaneWidth, rightPaneWidth)
                    .setDuration(ANIM_DURATION)
                    .start();
}


// -------------------------------------------------------------------------------------------
// --------------   Private methods
// -------------------------------------------------------------------------------------------


private void setMiddleWidth(int value)
{
    middleView.getLayoutParams().width = value;
    requestLayout();
}

@TargetApi(12)
private void translateWidgets(int deltaX, View... views)
{
    for (final View view : views)
    {
        ViewPropertyAnimator viewPropertyAnimator = view.animate();
        viewPropertyAnimator.translationXBy(deltaX)
                            .setDuration(ANIM_DURATION);
    }
  }

  private void resetWidget(View view, int width)
  {
      LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)view.getLayoutParams();  
      layoutParams.width = width;
      layoutParams.weight = 0;
  }
}

XML para o ContentFragment:

    <?xml version="1.0" encoding="utf-8"?>
<com.xyz.view.widget.ThreePaneLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_content_three_pane_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<FrameLayout
    android:id="@+id/fragment_content_framelayout_left"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3" />

<FrameLayout
    android:id="@+id/fragment_content_framelayout_middle"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="7" />

<FrameLayout
    android:id="@+id/fragment_content_framelayout_right"
    android:layout_width="0dp"
    android:layout_height="match_parent" />
</com.xyz.view.widget.ThreePaneLayout>

questionAnswers(2)

yourAnswerToTheQuestion