2014-07-13 34 views
0

我尝试creare为圆进步的自定义视图,我画一些点上绘制,比我想乌鸦的东西在这一点上,而进度的增加,这是我的代码:在视图上的Android绘图

public SpinnerView(Context context) { 
      super(context);  
    } 
     @SuppressLint("DrawAllocation") 
     protected void onDraw(Canvas canvas) { 
      //TODO Auto-generated method stub 
      super.onDraw(canvas); 

      float x = 0; 
      float y = 0; 

      for(int i=0; i<360; i = i + 12){ 

       x = (float) (view.getWidth()/2 + 260 * Math.cos(Math.toRadians(i))); 
       y = (float) (view.getHeight()/2 + 260 * Math.sin(Math.toRadians(i))); 

       Paint paint = new Paint(); 
       paint.setColor(Color.RED); 
       canvas.drawCircle((float) x, (float) y, 10, paint); 
      } 
      viewCanvas = canvas; 
     } 

     public void updateWithProgress (int progress){ 

      // progress : total = x : 36 

      int point = (360*progress)/total; 
      point = point/12; 

      Log.d("point" + point,"-------"); 

      float x = (float) (view.getWidth()/2 + 260 * Math.cos(Math.toRadians(point))); 
      float y = (float) (view.getHeight()/2 + 260 * Math.sin(Math.toRadians(point))); 

      Paint paint = new Paint(); 
      paint.setColor(Color.BLUE); 
      viewCanvas.drawCircle(x, y, 20, paint); 
     } 
    } 

问题是,updateWithProgress不起作用,它不会在旧的红色圆圈上绘制蓝色圆圈。

+0

你在哪里调用“updateWithProgress”? –

+0

里面的一个异步任务,这是因为我看到Log.d(“point”+ point,“-------”); – kikko088

+0

尝试无效(在视图中调用'invalidate();')查看调用updateWithProgress后的视图。 – Hardy

回答

0

你在这里的做法是不正确的。您不能通过在第1次迭代中保存画布来更新其他线程中的视图,然后在单独的线程上更新它。在onDraw方法调用期间,所有的UI更新都应该发生在UI线程上。

这里是我的建议:

  1. 保持所谓的“进步”的一个实例成员,添加一个getter和setter进步。
  2. 将“updateWithProgress”方法中的所有代码移动到您的“onDraw”方法中,其中“progress”实例成员将替换该参数。
  3. 每当进度需要更新时,通过视图上的获取者/设置者&调用postInvalidate来更改进度值。

这应该让你开始。

+0

谢谢,在您的帮助下我找到了解决方案! – kikko088