Invalidate不会调用onDraw

时间:2016-04-21 17:32:39

标签: android android-canvas

我需要通过单击按钮重绘图片,但是在方法无效后,onDraw方法不会被调用。但是只在运行应用程序后调用onDraw。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final Draw draw = new Draw(this);

    Button button = (Button) findViewById(R.id.btn);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            draw.setA(40);
            draw.setB(300);
            draw.invalidate();
        }
    });

}
}

这是代码Draw.java

public class Draw extends View {

private Paint mPaint;
private int a;
private int b;

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

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

public Draw(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init() {
    mPaint = new Paint();
    mPaint.setColor(Color.BLACK);
    mPaint.setStrokeWidth(5);
    setWillNotDraw(false);
    a = 0;
    b = 0;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(Color.WHITE);
    canvas.drawPaint(mPaint);

    mPaint.setColor(Color.BLACK);
    mPaint.setAntiAlias(true);
    canvas.drawLine(80, 50, 80, 500, mPaint);
    canvas.drawLine(80, 50, 70, 85, mPaint);
    canvas.drawLine(80, 50, 90, 85, mPaint);

    canvas.drawLine(80, 500, 500, 500, mPaint);
    canvas.drawLine(500, 500, 465, 510, mPaint);
    canvas.drawLine(500, 500, 465, 490, mPaint);

    mPaint.setTextSize(35);
    mPaint.setStrokeWidth(2);
    canvas.drawText("X", 480, 540, mPaint);
    canvas.drawText("Y", 45, 80, mPaint);
    canvas.drawText("0", 70, 540, mPaint);

    drawFunction(canvas, a, b);
}

public void drawFunction(Canvas canvas, int a, int b) { 

    mPaint.setColor(Color.BLACK);
    mPaint.setAntiAlias(true);
    canvas.drawLine(80, 500, a, b, mPaint);
}

public void setA(int a) {
    this.a = a;
}

public void setB(int b) {

    this.b = b;
}
}

main.xml中

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <labs.example.function.Draw
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </labs.example.function.Draw>
</RelativeLayout>

提前致谢。

2 个答案:

答案 0 :(得分:3)

添加ID

<labs.example.function.Draw
    android:id="@id/draw"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</labs.example.function.Draw>

替换

 final Draw draw = new Draw(this);

通过

 final Draw draw = (Draw) findViewById(R.id.draw); // need to refer to the view in xml.

如果您使用final Draw draw = new Draw(this);,则需要将该视图添加到视图层次。

答案 1 :(得分:0)

您是否尝试拨打setWillNotDraw(false)。在此post中,您可以看到默认情况下所有ViewGroup子类都不会调用其onDraw方法。