【问题标题】:Drawing on surfaceview problems绘制surfaceview问题
【发布时间】:2012-07-22 13:31:07
【问题描述】:

我正在尝试使用画布在表面视图上绘制文本。 问题是表面视图似乎在每次调用后都没有重置。之前绘制的所有内容都将再次绘制。所以,如果我有一个文本,每次绘制它时我都会改变它的位置,我最终会得到一个很长的文本痕迹,因为画布没有被清除。

我做错了什么?

public class Test1Activity extends Activity {

private Draw drawText;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     drawText = new Draw(this);
    setContentView(drawText);
}

public class Draw extends SurfaceView implements Runnable {

    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private int i;

    public Draw(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        surfaceHolder = getHolder();
        running = true;
        thread = new Thread(this);
        thread.start();
    }


    public void run() {
        // TODO Auto-generated method stub
        while (running) {
            if (surfaceHolder.getSurface().isValid()) {
                Canvas canvas = surfaceHolder.lockCanvas();

                Paint paint = new Paint();
                paint.setColor(Color.RED);
                i++;
                if(i > 240)
                    i = 1;

                canvas.drawText("Hello",i , 60, paint);

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

}
}      

public class Test1Activity extends Activity {


private Draw drawText;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     drawText = new Draw(this);
    setContentView(drawText);
}



public class Draw extends SurfaceView implements Runnable {

    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private int i;

    public Draw(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        surfaceHolder = getHolder();
        running = true;
        thread = new Thread(this);
        thread.start();
    }


    public void run() {
        // TODO Auto-generated method stub
        while (running) {
            if (surfaceHolder.getSurface().isValid()) {
                Canvas canvas = surfaceHolder.lockCanvas();

                Paint paint = new Paint();
                paint.setColor(Color.RED);
                i++;
                if(i > 240)
                    i = 1;

                canvas.drawText("Hello",i , 60, paint);

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

}

谢谢!

【问题讨论】:

    标签: android canvas surfaceview runnable


    【解决方案1】:

    在绘制某些东西之前,您必须先擦除画布,例如。 canvas.drawColor(Color.BLACK);

    • ereas(画黑色)
    • 绘制文字

    注意:不要在更新和渲染线程中创建 Paint 对象,这会使 GC 发疯!

    【讨论】:

      【解决方案2】:

      您可能需要在不同的 PorterDuff 模式下重新绘制过时的画布。 this link 很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多