本帖最后由 yxz329130952 于 2012-10-18 16:14:26 编辑

解决方案 »

  1.   

    ...你在ondraw()里面调用drawLine再试试
      

  2.   

    onDraw()里面调用drawLine之前我试过是可以的。但是让外部类调用就是不行,不知道为什么。难道android画图就非得在onDraw()里面一次性画完?
      

  3.   

    可以看一下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一下是没有用的
      

  4.   

    嗯,听了你的解释,我觉得你说得对。android每次必须回调onDraw才能画出图形。但是有没有动态绘图的方法呢?即,如果我需要可以直接在原来的canvas上再绘制一个图形,而原来的图形保持不变?望指教。
      

  5.   

    每次调用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就是我们保存绘制内容的全局对象