可以看一下view的源代码,
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
//....
public void draw(Canvas canvas) {
//....
onDraw(canvas);
//....
}
/**
* Implement this to do your drawing.
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(Canvas canvas) {
}
}
我们在自己的继承类中多态实现了onDraw()
这样流程就清楚了,我们知道view只有在onMeasure和onLayout调用,或者手动调用invalidate方法时才会开始重绘。来说一说楼主的逻辑吧
如果将drawLine方法直接放在onDraw里面,此时在第一次加载view或者手动调用invalidate()时都会发生绘制,如楼主所说可以看到线条,
但是如果按照楼主第二种方法手动调用drawLine(),此时没有发生重绘操作,即父view的draw()根本就没有发生回调,怎么可能有图形出现呢。
绘图不是只要在canvas中画一下就能完事儿的,每次绘图都涉及到背景重绘,图层等很多元素,所以单独drawLine一下是没有用的
2012-10-19 10:12:56 AlecVon 3楼
...你在ondraw()里面调用drawLine再试试
2012-10-18 17:02:24 IThink_88 1楼
onDraw()里面调用drawLine之前我试过是可以的。但是让外部类调用就是不行,不知道为什么。难道android画图就非得在onDraw()里面一次性画完?
2012-10-19 08:48:31 yxz329130952 2楼
引用 3 楼 的回复:可以看一下view的源代码,
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
//....
public void draw(Canvas canvas) {
//....
onDraw(canv……
嗯,听了你的解释,我觉得你说得对。android每次必须回调onDraw才能画出图形。但是有没有动态绘图的方法呢?即,如果我需要可以直接在原来的canvas上再绘制一个图形,而原来的图形保持不变?望指教。
2012-10-19 16:02:52 yxz329130952 4楼
每次调用onDraw都会重绘,所以要想累加绘制,我们必须要有一个全局的东西保存已经绘制的内容。但是楼主使用了Canvas来保存旧数据是不行的,因为每次绘制的canvas是新生成的,你保存的canvas根本没用上。
提供给你两种方法,一种是用数组保存每次绘制的线条,这种方法一般对单调的绘图比较有效,比如只绘制线段,只要在数组中保存各个线段的起始点就OK,每次在onDraw中全部在绘制一次,或者就使用一个bitmap对象保存内容,
//先绘制到bitmap上
Canvas tmp = new Canvas(mBitmap);
tmp.drawLine(mFirstX, mFirstY, mSecondX, mSecondY, mPaint);
//再把bitmap画到canvas上
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
mBitmap就是我们保存绘制内容的全局对象
2012-10-19 16:59:54 AlecVon 5楼
引用 5 楼 的回复:每次调用onDraw都会重绘,所以要想累加绘制,我们必须要有一个全局的东西保存已经绘制的内容。但是楼主使用了Canvas来保存旧数据是不行的,因为每次绘制的canvas是新生成的,你保存的canvas根本没用上。
提供给你两种方法,一种是用数组保存每次绘制的线条,这种方法一般对单调的绘图比较有效,比如只绘制线段,只要在数组中保存各个线段的起始点就OK,每次在onDraw中全部在绘制一次,或者就……
嗯,谢谢!
2012-10-19 21:03:50 yxz329130952 6楼