彩色动画闪烁

时间:2014-06-21 20:46:37

标签: java android

我试图使用here显示的技术,但不幸的是我遇到了一个问题。每当颜色淡入下一种颜色时,屏幕闪烁/闪烁白色。问题似乎来自这个类:

public class ColorAnimationDrawable extends Drawable implements Animatable {

private static final long FRAME_DURATION = 1000 / 60;
private static final long ANIMATION_DURATION = 1500;

private static final int ACCCENT_COLOR = 0x33FFFFFF;
private static final int DIM_COLOR = 0x33000000;

private static final Random mRandom = new Random();

private final Paint mPaint = new Paint();

private boolean mIsRunning;

private int mStartColor;
private int mEndColor;
private int mCurrentColor;

private long mStartTime;

@Override
public void draw(Canvas canvas) {
    final Rect bounds = getBounds();

    mPaint.setColor(mCurrentColor);
    canvas.drawRect(bounds, mPaint);

    mPaint.setColor(ACCCENT_COLOR);
    canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.top + 1, mPaint);

    mPaint.setColor(DIM_COLOR);
    canvas.drawRect(bounds.left, bounds.bottom - 2, bounds.right, bounds.bottom, mPaint);
}

@Override
public void setAlpha(int alpha) {
    oops("setAlpha(int)");
}

@Override
public void setColorFilter(ColorFilter cf) {
    oops("setColorFilter(ColorFilter)");
}

@Override
public int getOpacity() {
    return PixelFormat.TRANSPARENT;
}

@Override
public void start() {
    if (!isRunning()) {
        mIsRunning = true;

        mStartTime = AnimationUtils.currentAnimationTimeMillis();
        mStartColor = randomColor();
        mEndColor = randomColor();

        scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
        invalidateSelf();
    }
}

@Override
public void stop() {
    if (isRunning()) {
        unscheduleSelf(mUpdater);
        mIsRunning = false;
    }
}

@Override
public boolean isRunning() {
    return mIsRunning;
}

private void oops(String message) {
    throw new UnsupportedOperationException("ColorAnimationDrawable doesn't support " + message);
}

private static int randomColor() {
    return mRandom.nextInt() & 0x00FFFFFF;
}

private static int evaluate(float fraction, int startValue, int endValue) {
    return (int) (startValue + fraction * (endValue - startValue));
}

private final Runnable mUpdater = new Runnable() {
    @Override
    public void run() {
        long now = AnimationUtils.currentAnimationTimeMillis();
        long duration = now - mStartTime;
        if (duration >= ANIMATION_DURATION) {
            mStartColor = mEndColor;
            mEndColor = randomColor();
            mStartTime = now;
            mCurrentColor = mStartColor;
        } else {
            float fraction = duration / (float) ANIMATION_DURATION;
            //@formatter:off
            mCurrentColor = Color.rgb(
                    evaluate(fraction, Color.red(mStartColor), Color.red(mEndColor)),     // red
                    evaluate(fraction, Color.green(mStartColor), Color.green(mEndColor)), // green
                    evaluate(fraction, Color.blue(mStartColor), Color.blue(mEndColor)));  // blue
            //@formatter:on
        }
        scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
        invalidateSelf();
    }
};

}

我注意到,如果我将ANIMATION_DURATION更改为更长的时间,则闪烁之间的延迟也会更长。有谁知道问题是什么以及如何摆脱眨眼?

0 个答案:

没有答案