2011-11-12 4 views
2

サーフェイスビューを使用してインタラクティブなpiechartを描画しています。ここに私のコードは、すべての表面ビューの例のようになります。backgroundColorをAndroidのサーフェイスビューに設定するにはどうすればよいですか?

class PieChart extends SurfaceView implements SurfaceHolder.Callback { 

public PieChart(Context context) { 
     super(context); 
     // Log.i("PieChart", "PieChart : constructor"); 
     getHolder().addCallback(this); 
} 

@Override 
    public void onDraw(Canvas canvas) { 
     if (hasData) { 

      resetColor(); 
      try { 
       canvas.drawColor(getResources().getColor(R.color.graphbg_color)); 

       graphDraw(canvas); 
      } catch (ValicException ex) { 

      } 

     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

     Log.i("PieChart", "surfaceChanged"); 

    } 

    public int callCount = 0; 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

      try { 
       // Log.i("PieChart", "surfaceCreated"); 
       mChartThread = new ChartThread(getHolder(), this); 
       mChartThread.setRunning(true); 

       if (!mChartThread.isAlive()) { 
        mChartThread.start(); 
       } 

       Rect mFrame = holder.getSurfaceFrame(); 

       mOvalF = new RectF(0, 0, mFrame.right, mFrame.right); 

      } catch (Exception e) { 
       // No error message required 
      } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Log.i("PieChart", "surfaceDestroyed"); 
     boolean retry = true; 
     callCount = 0; 
     mChartThread.setRunning(false); 
     while (retry) { 
      try { 
       mChartThread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // No error message required 
      } 
     } 
    } 
} 

class ChartThread extends Thread { 

    private SurfaceHolder mSurfaceHolder; 
    private PieChart mPieChart; 
    private boolean mRefresh = false; 

    public ChartThread(SurfaceHolder surfaceHolder, PieChart pieChart) { 
     // Log.i("ChartThread", "ChartThread"); 
     mSurfaceHolder = surfaceHolder; 
     mPieChart = pieChart; 
    } 

    public void setRunning(boolean Refresh) { 
     // Log.i("ChartThread", "setRunning : " + Refresh); 
     mRefresh = Refresh; 
    } 

    @Override 
    public void run() { 
     Canvas c; 
     // Log.i("ChartThread", "run : " + mRefresh); 
     while (mRefresh) { 
      c = null; 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
      // c.drawColor(0xFFebf3f5); 
       synchronized (mSurfaceHolder) { 

        mPieChart.onDraw(c); 

       } 
      } catch (Exception ex) { 

      } finally { 
       // do this in a finally so that if an exception is thrown 
       // during the above, we don't leave the Surface in an 
       // inconsistent state 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
} 

これで円グラフを正常に描くことができます。ここで問題となるのは、「パイチャートの黒い四角形をロードする前に、表面ビューのデフォルトの背景である秒間表示されます」です。そこで私は、黒い四角形を避けるために、サーフェイスビューの背景色を設定したいと思います。

以下は、背景色をサーフェイスビューに描画するために変更されたコードです。

public PieChart(Context context) { 
      super(context); 
      // Log.i("PieChart", "PieChart : constructor"); 
      getHolder().addCallback(this); 
      setBackgroundColor(getResources().getColor(R.color.graphbg_color)); 
    } 


@Override 
    public void onDraw(Canvas canvas) { 
     if (hasData) { 
      setBackgroundColor(getResources().getColor(R.color.graphbg_color)); 
      resetColor(); 
      try { 
     canvas.drawColor(getResources().getColor(R.color.graphbg_color)); 

       graphDraw(canvas); 
      } catch (ValicException ex) { 

      } 

     } 
    } 

これらの変更では、黒い矩形の問題は解決されます。パイチャートは適切にリフレッシュされません。誰かが私にこれらの2つの問題の解決を手助けすることができますか?

答えて

4
class PieChart extends SurfaceView implements SurfaceHolder.Callback { 

private int backGroundColor = Color.BLACK; 

public PieChart(Context context,int backGroundColor) { 
    super(context); 
    setBackGroundColor(backGroundColor); 
    // Log.i("PieChart", "PieChart : constructor"); 
    getHolder().addCallback(this); 
} 

public void setBackGroundColor(int color){ 
    this.backGroundColor = color; 
} 

@Override 
public void onDraw(Canvas canvas) { 

      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL_AND_STROKE); 
      paint.setStrokeWidth(3); 
      paint.setAntiAlias(true); 
      paint.setColor(backGroundColor); 
    canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint); 

    if (hasData) { 

     resetColor(); 
     try { 

      canvas.drawColor(getResources().getColor(R.color.graphbg_color)); 

      graphDraw(canvas); 
     } catch (ValicException ex) { 

     } 

    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

    Log.i("PieChart", "surfaceChanged"); 

} 

public int callCount = 0; 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 

     try { 
      // Log.i("PieChart", "surfaceCreated"); 
      mChartThread = new ChartThread(getHolder(), this); 
      mChartThread.setRunning(true); 

      if (!mChartThread.isAlive()) { 
       mChartThread.start(); 
      } 

      Rect mFrame = holder.getSurfaceFrame(); 

      mOvalF = new RectF(0, 0, mFrame.right, mFrame.right); 

     } catch (Exception e) { 
      // No error message required 
     } 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // Log.i("PieChart", "surfaceDestroyed"); 
    boolean retry = true; 
    callCount = 0; 
    mChartThread.setRunning(false); 
    while (retry) { 
     try { 
      mChartThread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 
      // No error message required 
     } 
    } 
} 
} 

class ChartThread extends Thread { 

private SurfaceHolder mSurfaceHolder; 
private PieChart mPieChart; 
private boolean mRefresh = false; 

public ChartThread(SurfaceHolder surfaceHolder, PieChart pieChart) { 
    // Log.i("ChartThread", "ChartThread"); 
    mSurfaceHolder = surfaceHolder; 
    mPieChart = pieChart; 
} 

public void setRunning(boolean Refresh) { 
    // Log.i("ChartThread", "setRunning : " + Refresh); 
    mRefresh = Refresh; 
} 

@Override 
public void run() { 
    Canvas c; 
    // Log.i("ChartThread", "run : " + mRefresh); 
    while (mRefresh) { 
     c = null; 
     try { 
      c = mSurfaceHolder.lockCanvas(null); 
     // c.drawColor(0xFFebf3f5); 
      synchronized (mSurfaceHolder) { 

       mPieChart.onDraw(c); 

      } 
     } catch (Exception ex) { 

     } finally { 
      // do this in a finally so that if an exception is thrown 
      // during the above, we don't leave the Surface in an 
      // inconsistent state 
      if (c != null) { 
       mSurfaceHolder.unlockCanvasAndPost(c); 
      } 
     } 
    } 
} 
} 

、あなたはsetBackGroundColor(あなたの色)を使用することができますyoutは、クラスのクライアントで;)

+0

こんにちはademarあなたのデータは不完全です。あなたはデータの完全なセットで私を助けてくださいできますか? –

+0

@BorntoWinこんにちは、何が不完全なデータですか? – ademar111190

+0

あなたのresetcolor()メソッドはどこですか?上記の実装は、私たちが選択したサーフェスビューを透過的かつカラフルにしますか? –

関連する問題