即使我调用invalidate(),Canvas也不会更新?

时间:2014-10-10 13:22:36

标签: java android android-view

我想创建一个自定义视图来动画一些线条。所以我创建了一个扩展View类的类。我致电onDraw()&画在画布上。 以下是我到目前为止所采用的一些代码。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    p += 10;
    canvas.drawLine(5, 5, p, 5, mPaint);
    invalidate();
}

请注意p& mPaint在构造函数中实例化。

但是,即使我调用了invalidate()方法,它也不会更新画布,也就是说没有为该线设置动画。

那么,如何解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

你确定它没画画吗?你的Paint对象是什么颜色的?

我创建了一个空白的4.4 android应用程序,添加了这个类:

package ca.kieve.playground;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class AnimView extends View {
    private int p = 0;
    private Paint mPaint;

    public AnimView(Context context) {
        super(context);
        init();
    }

    public AnimView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStrokeWidth(10);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        p += 1;
        canvas.drawLine(5, 5, p, 5, mPaint);
        invalidate();
    }
}

并将activity_main.xml更改为:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ca.kieve.playground.MainActivity" >

    <ca.kieve.playground.AnimView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

这没有任何问题。

答案 1 :(得分:-1)

删除

invalidate() form onDraw(). 

使用

inavalidate() while you have done with your changes.