how to set backgroundColor to a surfaceview in and

2019-02-26 05:04发布

问题:

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.

回答1:

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