动画在4.2中正常工作,但在2.3中有错误

时间:2013-03-17 14:20:16

标签: android android-layout android-animation

这可能有点长,但在解释时我会很清楚。

我正在开发一个应用程序,它基本上由布局组成,有两个相对布局。单击两个布局中的任何一个时,第二个布局会扩展或缩小其实际可见性的延迟。

这是布局:

enter image description here

这是侦听任何点击“主”或“子”以扩展/缩小的代码:

    public void toggleAmagar(View v){
        View parent = (View) v.getParent();
        View child = parent.findViewById(R.id.child);
        Log.d("debugging","toggle amagar. Child visibility is :"+child.getVisibility()+". Clickable? Child: "+child.isClickable()+". Parent: "+v.isClickable());
        ExpandAnimation expandAni = new ExpandAnimation(child, 500);
        child.startAnimation(expandAni);
    }

这是动画类:

public class ExpandAnimation extends Animation {
private View mAnimatedView;
private LayoutParams mViewLayoutParams;
private int mMarginStart, mMarginEnd;
private boolean mIsVisibleAfter = false;
private boolean mWasEndedAlready = false;

public ExpandAnimation(View view, int duration) {
    setDuration(duration);
    mAnimatedView = view;
    mViewLayoutParams = (LayoutParams) view.getLayoutParams();
    // decide to show or hide the view
    mIsVisibleAfter = (view.getVisibility() == View.VISIBLE);

    mMarginStart = mViewLayoutParams.bottomMargin;
    mMarginEnd = (mMarginStart == 0 ? (0- view.getHeight()) : 0);
    view.setVisibility(View.VISIBLE);
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    super.applyTransformation(interpolatedTime, t);
    Log.d("debugging","aplicant. Visible = "+this.mAnimatedView.getVisibility());
    mAnimatedView.setClickable(false);
    if (this.hasEnded()){
        mAnimatedView.setClickable(true);
        View pare = (View) mAnimatedView.getParent();
        View germa = (View) pare.findViewById(R.id.main);
        germa.setClickable(true);
    } else {
        mAnimatedView.setClickable(false);
        View pare = (View) mAnimatedView.getParent();
        View germa = (View) pare.findViewById(R.id.main);
        germa.setClickable(false);
    }
    if (interpolatedTime < 1.0f) {

        // Calculating the new bottom margin, and setting it
        mViewLayoutParams.bottomMargin = mMarginStart
                + (int) ((mMarginEnd - mMarginStart) * interpolatedTime);

        // Invalidating the layout, making us seeing the changes we made
        mAnimatedView.requestLayout();

    // Making sure we didn't run the ending before (it happens!)
    } else if (!mWasEndedAlready) {
        mViewLayoutParams.bottomMargin = mMarginEnd;
        mAnimatedView.requestLayout();

        if (mIsVisibleAfter) {
            mAnimatedView.setVisibility(View.GONE);

        }
        mWasEndedAlready = true;
    }
}

这是Android 2.3中发生的情况: enter image description here

这些是生成的日志:

日志A:

03-17 13:57:17.509: D/debugging(403): toggle amagar. Child visibility is :0. Clickable? Child: true. Parent: true
03-17 13:57:17.521: D/debugging(403): aplicant. Visible = 0
03-17 13:57:17.549: D/debugging(403): aplicant. Visible = 0
03-17 13:57:17.619: D/debugging(403): aplicant. Visible = 0
03-17 13:57:17.699: D/debugging(403): aplicant. Visible = 0
03-17 13:57:17.789: D/debugging(403): aplicant. Visible = 0
03-17 13:57:17.929: D/debugging(403): aplicant. Visible = 0
03-17 13:57:18.119: D/debugging(403): aplicant. Visible = 0
03-17 13:57:18.189: D/debugging(403): aplicant. Visible = 8

日志B

03-17 13:57:45.439: D/debugging(403): toggle amagar. Child visibility is :8. Clickable? Child: true. Parent: true

现在我正在做同样的事情,但在4.2(4.0.4真实设备以相同的方式工作): enter image description here

这些是日志:

日志A:

03-17 14:13:06.104: D/debugging(815): toggle amagar. Child visibility is :0. Clickable? Child: true. Parent: true
03-17 14:13:06.192: D/debugging(815): aplicant. Visible = 0
03-17 14:13:06.212: D/debugging(815): aplicant. Visible = 0
03-17 14:13:06.475: D/debugging(815): aplicant. Visible = 0
03-17 14:13:06.692: D/debugging(815): aplicant. Visible = 0
03-17 14:13:06.792: D/debugging(815): aplicant. Visible = 8

日志B:

03-17 14:13:08.923: D/debugging(815): toggle amagar. Child visibility is :8. Clickable? Child: true. Parent: true
03-17 14:13:09.013: D/debugging(815): aplicant. Visible = 0
03-17 14:13:09.022: D/debugging(815): aplicant. Visible = 0
03-17 14:13:09.232: D/debugging(815): aplicant. Visible = 0
03-17 14:13:09.442: D/debugging(815): aplicant. Visible = 0
03-17 14:13:09.666: D/debugging(815): aplicant. Visible = 0
03-17 14:13:09.803: D/debugging(815): aplicant. Visible = 0

正如您所看到的,唯一的区别是第二次点击没有在2.3设备上应用动画。

我已经在2.3的真实设备上进行了测试,而在4.0.4的其他设备上进行了测试,它也正在进行中。那些是虚拟化的。

如果您需要更多信息,请向我询问。

哦,顺便说一句,动画类中的setClickable()技巧是为了防止用户双击动画和布局,以防万一你想知道它。

谢谢。

塞吉

修改 试过几个SDKS:

  • 2.2 - &gt;错误
  • 2.3 - &gt;错误
  • 4.2 - &gt;行
  • 4.0 - &gt;行

编辑19/03

更新:仍在发生,我无法找出原因。 明天如果没有人找到答案,我会继续调试......谢谢。

0 个答案:

没有答案