【问题标题】:Android custom view invalidate() animation not triggering ondraw or drawAndroid自定义视图invalidate()动画不触发ondraw或draw
【发布时间】:2014-03-14 06:58:22
【问题描述】:

我创建了一个自定义视图类,用于绘制饼图并为其设置动画。首先,我让类扩展了可绘制对象,然后将可绘制对象应用于视图,并且效果很好。我改变了它,所以现在这个类扩展了一个相对布局,我可以在 xml 布局中使用它。 animateDraw() 方法是一个值动画器,应该使触发 ondraw() 但绘制时永远不会触发的视图无效

public class PieView extends RelativeLayout {

public PieView(Context context) {
    super(context);
}

public PieView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public PieView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

}

private HashMap<Integer, Integer> mValues = new HashMap<Integer, Integer>();
private Paint paint;
private float totalArcElapsed;
public boolean animating;
private float dataSum = 0;

public void setValues(HashMap<Integer, Integer> values) {


    this.paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);

    for (Map.Entry<Integer, Integer> entry : mValues.entrySet()) {
        Integer key = entry.getKey();

        dataSum += (float) key;
    }
}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub

    Log.d(MyApp.TAG, "on draw");
    super.onDraw(canvas);
}

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    Log.d(MyApp.TAG, "draw");
    float startAngle = 0;

    RectF rectBounds = new RectF(getLeft(), getTop(), getRight(), getBottom());

    for (Map.Entry<Integer, Integer> entry : mValues.entrySet()) {

        float sliceValue = (float) entry.getKey();
        Integer colorRes = entry.getValue();
        paint.setColor(colorRes);

        float angleSweep = 360 * (sliceValue / dataSum);

        if ((startAngle + angleSweep) < totalArcElapsed) {

            canvas.drawArc(rectBounds, startAngle, angleSweep, true, paint);
        }
        else {

            float portion = angleSweep - ((startAngle + angleSweep) - totalArcElapsed);
            canvas.drawArc(rectBounds, startAngle, portion, true, paint);
            break;
        }

        startAngle += angleSweep;
    }
}

public void animateDraw() {
    ValueAnimator animation = ValueAnimator.ofInt(0, 360);
    animation.setDuration(2000);

    animation.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float fraction = animation.getAnimatedFraction();
            int value = (Integer) animation.getAnimatedValue();
            totalArcElapsed = value;
            Log.d(MyApp.TAG, totalArcElapsed + " ");
                            invalidate();

        }
    });
    animation.addListener(new AnimatorListener() {

        @Override
        public void onAnimationStart(Animator animation) {

            animating = true;
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            animating = false;

        }

        @Override
        public void onAnimationCancel(Animator animation) {


        }
    });
    animation.start();

}

}

【问题讨论】:

  • 可能是旧帖子,对于将来遇到此帖子的人来说。登录 onDraw 是个坏主意

标签: android android-layout android-view android-drawable


【解决方案1】:

请参阅下面的链接以获取可能对您有用的详细答案和可能的解决方法:

Why onDraw is not called after invalidate()?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多