how to set backgroundColor to a surfaceview in android?

10,491
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);
            }
        }
    }
}
}

and in yout class client you can use the setBackGroundColor(your color) ;)

Share:
10,491
Raj
Author by

Raj

Updated on June 13, 2022

Comments

  • Raj
    Raj almost 2 years

    i am using a surface view to draw interactive piechart. here is my code which will looks like all surface view examples.

    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);
                    }
                }
            }
        }
    }
    

    with this i am able to draw pie charts successfully. but here the issue is "before loading pie chart black rectangle is visible for a second which is surfaceview's default back ground". so I want to set background color for surface view to avoid the black rectangle.

    The following is the changed code for drawing background color to surface view.

     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) {
    
                }
    
            }
        }
    

    with these changes, black rectangle issue is resolved. but piechart is not refreshing properly. can someone help me to resolve any of these two issues.