在安卓中清除SurfaceView

3
如何在安卓中清除SurfaceView?
我有一个如下的类 -
class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback {

请问我应该调用哪个方法来清除我的自定义绘图面板?

这是我的类 -

package com.applenty.LearnToCount;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;

public class WhiteBoard extends Activity {
    private ArrayList<Path> _graphics = new ArrayList<Path>();
    private Paint mPaint;
    Button button_clear;
    FrameLayout layout;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.shake);

        layout = new FrameLayout(this);
        final LinearLayout l1 = new LinearLayout(this);
        final LinearLayout l2 = new LinearLayout(this);

        final DrawingPanel drawingPanel = new DrawingPanel(this);
        // drawingPanel.setBackgroundColor(Color.WHITE);

        LayoutParams params = new LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        button_clear = new Button(this);
        button_clear.setText("Clear Screen");
        button_clear.setGravity(Gravity.TOP | Gravity.LEFT);
        button_clear.setVisibility(View.VISIBLE);
        button_clear.setId(1);
        button_clear.setLayoutParams(params);
        //layout.addView(button_clear);

        drawingPanel.setLayoutParams(params);
        drawingPanel.setId(2);


        l1.addView(button_clear);
        l2.addView(drawingPanel);

        layout.addView(l2);
        layout.addView(l1);
        setContentView(layout);
        mPaint = new Paint();
        mPaint.setDither(true);
        mPaint.setColor(Color.RED);
        mPaint.setColorFilter(new ColorFilter());
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(5);

        button_clear = (Button)findViewById(1);
        button_clear.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast t = Toast.makeText(WhiteBoard.this, "ISNIDE", 3);
                t.show();
                Log.d("DEBUG","CLEARING***************************");
                //Canvas canvas = new Canvas();
                //canvas.drawColor(0);
                //Canvas canvas = new Canvas();
                //canvas.drawColor(Color.WHITE);
                drawingPanel.setBackgroundColor(Color.WHITE);
                Canvas c = new Canvas();
                drawingPanel._thread.getSurfaceHolder().unlockCanvasAndPost(c);


                //drawingPanel.getHolder().unlockCanvasAndPost(canvas);
                //canvas = drawingPanel.getHolder().lockCanvas(null);
            }
        });

    }

    class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback {
        private DrawingThread _thread;
        private Path path;

        public DrawingPanel(Context context) {
            super(context);
            getHolder().addCallback(this);
            _thread = new DrawingThread(getHolder(), this);
        }

        public boolean onTouchEvent(MotionEvent event) {
            synchronized (_thread.getSurfaceHolder()) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    path = new Path();
                    path.moveTo(event.getX(), event.getY());
                    path.lineTo(event.getX(), event.getY());
                } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    path.lineTo(event.getX(), event.getY());
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    path.lineTo(event.getX(), event.getY());
                    _graphics.add(path);
                }

                return true;
            }
        }

        @Override
        public void onDraw(Canvas canvas) {
            for (Path path : _graphics) {
                // canvas.drawPoint(graphic.x, graphic.y, mPaint);
                canvas.drawPath(path, mPaint);
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub

        }

        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            _thread.setRunning(true);
            _thread.start();
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            boolean retry = true;
            _thread.setRunning(false);
            while (retry) {
                try {
                    _thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // we will try it again and again...
                }
            }
        }
    }

    class DrawingThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private DrawingPanel _panel;
        private boolean _run = false;

        public DrawingThread(SurfaceHolder surfaceHolder, DrawingPanel panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }

        public void setRunning(boolean run) {
            _run = run;
        }

        public SurfaceHolder getSurfaceHolder() {
            return _surfaceHolder;
        }

        @Override
        public void run() {
            Canvas c;
            while (_run) {
                c = null;
                try {
                    c = _surfaceHolder.lockCanvas(null);
                    synchronized (_surfaceHolder) {
                        _panel.onDraw(c);
                    }
                } 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) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            startActivity(new Intent(WhiteBoard.this, HomeActivity.class));
            finish();
            return true;
        }
        return true;
    }

}

我希望您能够在OnClickListner上清除屏幕。有什么想法请提出...

3个回答

13

对于其他需要清除画布的人,如果简单地将其涂成黑色或其他颜色无法实现,请看这里。我的问题是我想要清除一个透明画布,它覆盖在系统屏幕上,所以将其涂成黑色是不够的。这个方法可行:

canvas.drawColor( 0, PorterDuff.Mode.CLEAR );

感谢我在这个帖子里找到了这个方法。clear transparent canvas - Google Groups


1
完成后,我遇到了这个错误:MediaPlayer: Error (1,-1004),并且MediaPlayer无法播放任何视频。 - Idemax
1
它对我有效。顺便提一下,为了代码可读性,可以使用“Color.TRANSPARENT”来获取值“0”。 - Bahadir Tasdemir
请将画布填充为黑色,而不是透明的。 - Dyno Cris

3
你不清除它,只是避免在画布上绘制任何东西...只需使用空画布(可以绘制黑色矩形或者你想要的任何背景)。

3
иҜ·ж”№з”Ёcanvas.drawColor(Color.BLACK)д»Јжӣҝ常规з»ҳеӣҫж–№жі•пјҲдҪҝз”Ёд»ҺSurfaceHolderиҺ·еҫ—зҡ„CanvasеҜ№иұЎпјүгҖӮ - Aleadam
1
你是不是指像这样 - drawingPanel.getHolder().getSurface()?我很困惑 :S - nasaa
点击这里查看http://www.anddev.org/2d_tutorial-t3120.html(Croccy22发布的帖子),以获取一个快速示例(LunarLander示例太复杂了,不适合入门)。这里还有另一个非常简单的示例:http://www.edu4java.com/androidgame/androidgame2.html。在第二个示例中,只需避免canvas.drawBitmap行即可。 - Aleadam
1
做这个很简单,我试过了 -drawingPanel.setBackgroundColor(Color.WHITE); _graphics.clear(); - nasaa

0
button_clear = (Button)findViewById(1);
button_clear.setOnClickListener(new View.OnClickListener() {
  public void onClick(View v) {
    Intent i = new Intent(getBaseContext(),Drawing.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
  }
});

1
附带一些答案描述。 - Vishal Pawar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接