1

我在触摸事件的基础上在画布上的图像上绘制多条线。当我单击我需要以先进先出的方式删除行时,我在活动中有一个清除按钮。我将触摸坐标存储在 arrayobject 中,并在 ondraw() 方法中使用它。我正在清除按钮单击时的矢量。但它在 onDraw() 方法中不起作用。请帮助我。

public class ImageViewTest extends SurfaceView implements ClearData,SurfaceHolder.Callback {
    int xpoint, ypoint, xendpoint, yendpoint;
    Vector v, v1;
    Canvas canvas;
    private ViewThread mThread;
    boolean motionevent = false ,clear =false;
    ArrayList<Vector> objects = new ArrayList<Vector>();
    ArrayList<Vector> objects1 = new ArrayList<Vector>();
    Vector vobj = new Vector();

    public ImageViewTest(Context context) {
        super(context);
        getHolder().addCallback(this);
        mThread = new ViewThread(this);
        // TODO Auto-generated constructor stub
    }

    public ImageViewTest(Context context, AttributeSet attr) {

        super(context, attr);
        getHolder().addCallback(this);
        mThread = new ViewThread(this);
        // TODO Auto-generated constructor stub
    }

    public void cleardata() {
         System.out.println(" cleardata");
         this.objects.clear();
         this.objects1.clear();
        // v = null;
        //
        //
        // System.out.println(" v value "+v);
    //  onDraw(canvas);
        invalidate();

    }


    public void doDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        //super.onDraw(canvas);

        Paint p = new Paint();

        System.out.println("ondraw " + objects.size() + " // "
                + objects1.size()+ "CANVAS "+canvas);

        DisplayMetrics metrics = getResources().getDisplayMetrics();

        Bitmap mapImg = BitmapFactory.decodeResource(getResources(),
                R.drawable.film2);
        Rect dest = new Rect(0, 0, getWidth(), getHeight());
        p.setFilterBitmap(true);
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(mapImg, null, dest, p);
        if(motionevent)
        {
            p.setColor(Color.RED);
            p.setStrokeWidth(2);
            canvas.drawLine(xpoint, ypoint, xendpoint, yendpoint, p);

        }else{
            canvas.drawBitmap(mapImg, null, dest, p);
        //  System.out.println("Objects size "+objects.size()+" // "+objects1.size());
//
        for (int index = 0; index < objects.size(); index++) {



            p.setColor(Color.RED);
            p.setStrokeWidth(2);



            Vector vv = objects.get(index);
            Vector vv1 = new Vector();



            xpoint = (int) Float.parseFloat(vv.elementAt(0).toString());
            ypoint = (int) Float.parseFloat(vv.elementAt(1).toString());

            if (objects1.size() > index) {
                vv1 = objects1.get(index);
            //  System.out.println("VV SIZE " + vv.size() + " // " + vv1.size());
                if (vv1.size() == 2) {
                    xendpoint = (int) Float.parseFloat(vv1.elementAt(0)
                            .toString());
                    yendpoint = (int) Float.parseFloat(vv1.elementAt(1)
                            .toString());
                }
            }

            canvas.drawLine(xpoint, ypoint, xendpoint, yendpoint, p);

        }
        }

        // canvas.drawLine(xpoint, ypoint, xendpoint, yendpoint, p);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //System.out.println("getAction  " + event.getAction());
        //System.out.println("X CORdinates " + event.getX() + " Y coornaf  "
        //      + event.getY() + " V " + objects.size());
        v = new Vector();
        v1 = new Vector();
        switch (event.getAction()) {
        case 0: // down
            xpoint = (int) event.getX();
            ypoint = (int) event.getY();
            v.add(event.getX());
            v.add(event.getY());
            objects.add(v);

            break;
        case 1: // up
            motionevent = false;
            v1.add(event.getX());
            v1.add(event.getY());
            objects1.add(v1);
            break;
        case 2: // move
            motionevent = true;
            xendpoint = (int) event.getX();
            yendpoint = (int) event.getY();

            break;

        }

        // if(v.isEmpty())
        // {
        // v.add(event.getX());
        // v.add(event.getY());
        // System.out.println("hi ");
        // xpoint =(int)Float.parseFloat(v.get(0).toString());
        // ypoint = (int)Float.parseFloat(v.get(1).toString());
        //
        //
        // }
        // xendpoint = (int)event.getX();
        // yendpoint = (int)event.getY();
        // DisplayMetrics metrics = getResources().getDisplayMetrics();
        invalidate();
        return true;
    }

    @Override
    public void clearData() {
        // TODO Auto-generated method stub
        System.err.println(" hi m");



         this.objects.clear();
         this.objects1.clear();
         System.out.println("OBJECTS VALUE "+objects.size()+ " // "+objects1.size() );
         clear =true;

         System.err.println(clear+" CLEAR");

         //  postInvalidate();
        // onDraw(canvas);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        System.err.println("Srface changed");
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        System.out.println("Surface created");
        if (!mThread.isAlive()) {
            mThread = new ViewThread(this);
            mThread.setRunning(true);
            mThread.start();
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    class ViewThread extends Thread {
        private ImageViewTest mPanel;
        private SurfaceHolder mHolder;
        private boolean mRun = false;

        public ViewThread(ImageViewTest panel) {
            System.out.println("ViewThREd constructor");
            mPanel = panel;
            mHolder = mPanel.getHolder();
        }

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

        @Override
        public void run() {
            Canvas canvas = null;
            while (mRun) {
                  System.out.println("Inside Run  "+mPanel.clear);
                canvas = mHolder.lockCanvas(); 
                if (canvas != null) {
                    if(clear)
                    {
                        System.out.println("clear call back");
                        mHolder.removeCallback(mPanel);
                    }
                    mPanel.doDraw(canvas);
                    mHolder.unlockCanvasAndPost(canvas);
                }
            }
        }

}
}
4

0 回答 0