如何设置的backgroundColor在Android的一个surfaceview? [英] how to set backgroundColor to a surfaceview in android?

查看:746
本文介绍了如何设置的backgroundColor在Android的一个surfaceview?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是表面观画的互动饼图。这里是我的code这会看起来像所有表面观例子。

 类饼图扩展了SurfaceView实现SurfaceHolder.Callback {

公共饼图(上下文的背景下){
        超(上下文);
        // Log.i(饼图,饼图:构造);
        。getHolder()的addCallback(本);
}

@覆盖
    公共无效的OnDraw(帆布油画){
        如果(hasData){

            resetColor();
            尝试 {
                canvas.drawColor(getResources()的getColor(R.color.graphbg_color));

                graphDraw(画布);
            }赶上(ValicException前){

            }

        }
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
            INT高度){

        Log.i(饼图,surfaceChanged);

    }

    公众诠释callCount = 0;

    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有者){

            尝试 {
                // Log.i(饼图,surfaceCreated);
                mChartThread =新ChartThread(getHolder(),这一点);
                mChartThread.setRunning(真正的);

                如果(!mChartThread.isAlive()){
                    mChartThread.start();
                }

                矩形mFrame = holder.getSurfaceFrame();

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

            }赶上(例外五){
                //无需错误信息
            }

    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有者){
        // Log.i(饼图,surfaceDestroyed);
        布尔重试= TRUE;
        callCount = 0;
        mChartThread.setRunning(假);
        而(重试){
            尝试 {
                mChartThread.join();
                重试= FALSE;
            }赶上(InterruptedException异常E){
                //无需错误信息
            }
        }
    }
}

类ChartThread继承Thread {

    私人SurfaceHolder mSurfaceHolder;
    私人饼图mPieChart;
    私人布尔mRefresh = FALSE;

    公共ChartThread(SurfaceHolder surfaceHolder,饼图饼图){
        // Log.i(ChartThread,ChartThread);
        mSurfaceHolder = surfaceHolder;
        mPieChart =饼图;
    }

    公共无效setRunning(布尔刷新){
        // Log.i(ChartThread,setRunning:+刷新);
        mRefresh =刷新;
    }

    @覆盖
    公共无效的run(){
        帆布℃;
        // Log.i(ChartThread,运行+ mRefresh);
        而(mRefresh){
            C = NULL;
            尝试 {
                C = mSurfaceHolder.lockCanvas(空);
            // c.drawColor(0xFFebf3f5);
                同步(mSurfaceHolder){

                    mPieChart.onDraw(C);

                }
            }赶上(例外前){

            } 最后 {
                //这样做的最后,这样,如果抛出一个异常
                //上面的过程中,我们不留在表面
                //不一致的状态
                如果(C!= NULL){
                    mSurfaceHolder.unlockCanvasAndPost(C);
                }
            }
        }
    }
}
 

这个我能够成功地绘制饼图。但这里的问题是前装饼图​​黑色矩形是第二个是surfaceview的默认回地面可见。所以我想设置背景颜色,表面观,以避免黑色矩形。

以下是改变的code代表绘制背景色进行表面图。

 公共饼图(上下文的背景下){
            超(上下文);
            // Log.i(饼图,饼图:构造);
            。getHolder()的addCallback(本);
            setBackgroundColor(getResources()的getColor(R.color.graphbg_color));
    }


@覆盖
    公共无效的OnDraw(帆布油画){
        如果(hasData){
             setBackgroundColor(getResources()的getColor(R.color.graphbg_color));
            resetColor();
            尝试 {
        canvas.drawColor(getResources()的getColor(R.color.graphbg_color));

                graphDraw(画布);
            }赶上(ValicException前){

            }

        }
    }
 

这些变化,黑色的长方形问题解决了。但饼图不刷新正确。有人可以帮我解决任何这两个问题。

解决方案

 类饼图扩展了SurfaceView实现SurfaceHolder.Callback {

私人诠释BACKGROUNDCOLOR = Color.BLACK;

公共饼图(上下文的背景下,诠释BACKGROUNDCOLOR){
    超(上下文);
    setBackGroundColor(BACKGROUNDCOLOR);
    // Log.i(饼图,饼图:构造);
    。getHolder()的addCallback(本);
}

公共无效setBackGroundColor(INT颜色){
    this.backGroundColor =颜色;
}

@覆盖
公共无效的OnDraw(帆布油画){

            涂料粉刷=新的油漆();
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            paint.setStrokeWidth(3);
            paint.setAntiAlias​​(真正的);
            paint.setColor(BACKGROUNDCOLOR);
    canvas.drawRect(0,0,this.getWidth(),this.getHeight(),漆);

    如果(hasData){

        resetColor();
        尝试 {

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

            graphDraw(画布);
        }赶上(ValicException前){

        }

    }
}

@覆盖
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
        INT高度){

    Log.i(饼图,surfaceChanged);

}

公众诠释callCount = 0;

@覆盖
公共无效surfaceCreated(SurfaceHolder持有者){

        尝试 {
            // Log.i(饼图,surfaceCreated);
            mChartThread =新ChartThread(getHolder(),这一点);
            mChartThread.setRunning(真正的);

            如果(!mChartThread.isAlive()){
                mChartThread.start();
            }

            矩形mFrame = holder.getSurfaceFrame();

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

        }赶上(例外五){
            //无需错误信息
        }

}

@覆盖
公共无效surfaceDestroyed(SurfaceHolder持有者){
    // Log.i(饼图,surfaceDestroyed);
    布尔重试= TRUE;
    callCount = 0;
    mChartThread.setRunning(假);
    而(重试){
        尝试 {
            mChartThread.join();
            重试= FALSE;
        }赶上(InterruptedException异常E){
            //无需错误信息
        }
    }
}
}

类ChartThread继承Thread {

私人SurfaceHolder mSurfaceHolder;
私人饼图mPieChart;
私人布尔mRefresh = FALSE;

公共ChartThread(SurfaceHolder surfaceHolder,饼图饼图){
    // Log.i(ChartThread,ChartThread);
    mSurfaceHolder = surfaceHolder;
    mPieChart =饼图;
}

公共无效setRunning(布尔刷新){
    // Log.i(ChartThread,setRunning:+刷新);
    mRefresh =刷新;
}

@覆盖
公共无效的run(){
    帆布℃;
    // Log.i(ChartThread,运行+ mRefresh);
    而(mRefresh){
        C = NULL;
        尝试 {
            C = mSurfaceHolder.lockCanvas(空);
        // c.drawColor(0xFFebf3f5);
            同步(mSurfaceHolder){

                mPieChart.onDraw(C);

            }
        }赶上(例外前){

        } 最后 {
            //这样做的最后,这样,如果抛出一个异常
            //上面的过程中,我们不留在表面
            //不一致的状态
            如果(C!= NULL){
                mSurfaceHolder.unlockCanvasAndPost(C);
            }
        }
    }
}
}
 

和YOUT类客户端,您可以使用setBackGroundColor(你的颜色);)

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.

解决方案

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

这篇关于如何设置的backgroundColor在Android的一个surfaceview?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆