Java Android:如何在Android中删除getHolder()中的数据

Java Android:如何在Android中删除getHolder()中的数据,java,android,Java,Android,在触摸事件的基础上,我在画布上画了多条线。当我点击时,活动中有一个清除按钮,我需要以后进先出的方式删除行。我在arrayobject中存储触摸坐标,并在ondraw()方法中使用该坐标。我在点击按钮时清除了向量,但在onDraw()方法中没有效果。请帮我做这件事 public class ImageViewTest extends SurfaceView implements ClearData,SurfaceHolder.Callback { int xpoint, ypoint, x

在触摸事件的基础上,我在画布上画了多条线。当我点击时,活动中有一个清除按钮,我需要以后进先出的方式删除行。我在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);
                }
            }
        }

}
}
公共类ImageViewTest扩展了SurfaceView实现了ClearData、SurfaceHolder.Callback{
int xpoint、ypoint、xendpoint、yendpoint;
向量v,v1;
帆布;
私有视图线程mThread;
布尔motionevent=false,clear=false;
ArrayList对象=新的ArrayList();
ArrayList objects1=新的ArrayList();
向量vobj=新向量();
公共ImageViewTest(上下文){
超级(上下文);
getHolder().addCallback(此);
mThread=新视图线程(此);
//TODO自动生成的构造函数存根
}
公共ImageViewTest(上下文、属性集属性){
超级(上下文,attr);
getHolder().addCallback(此);
mThread=新视图线程(此);
//TODO自动生成的构造函数存根
}
public void cleardata(){
System.out.println(“cleardata”);
this.objects.clear();
this.objects1.clear();
//v=零;
//
//
//系统输出打印项次(“v值”+v);
//onDraw(帆布);
使无效();
}
公共虚空doDraw(画布){
//TODO自动生成的方法存根
//super.onDraw(帆布);
油漆p=新油漆();
System.out.println(“ondraw”+objects.size()+”/“
+objects1.size()+“画布”+画布);
DisplayMetrics=getResources().getDisplayMetrics();
位图mapImg=BitmapFactory.decodeResource(getResources(),
R.drawable.film2);
Rect dest=new Rect(0,0,getWidth(),getHeight());
p、 setFilterBitmap(真);
画布。drawColor(颜色。黑色);
drawBitmap(mapImg,null,dest,p);
如果(运动事件)
{
p、 setColor(Color.RED);
p、 设定行程宽度(2);
画布.抽绳(X点、Y点、X点、Y点、p);
}否则{
drawBitmap(mapImg,null,dest,p);
//System.out.println(“对象大小”+Objects.size()+“/”+objects1.size());
//
对于(int index=0;index索引){
vv1=objects1.get(索引);
//System.out.println(“VV SIZE”+VV.SIZE()+“/”+vv1.SIZE());
如果(vv1.size()==2){
xendpoint=(int)Float.parseFloat(vv1.elementAt(0)
.toString());
yendpoint=(int)Float.parseFloat(vv1.elementAt(1)
.toString());
}
}
画布.抽绳(X点、Y点、X点、Y点、p);
}
}
//画布.抽绳(X点、Y点、X点、Y点、p);
}
@凌驾
公共布尔onTouchEvent(运动事件){
//System.out.println(“getAction”+event.getAction());
//System.out.println(“X CORdinates”+event.getX()+“Y coornaf”
//+event.getY()+“V”+objects.size());
v=新向量();
v1=新向量();
开关(event.getAction()){
案例0://向下
xpoint=(int)event.getX();
ypoint=(int)event.getY();
v、 添加(event.getX());
v、 添加(event.getY());
对象。添加(v);
打破
案例1://向上
motionevent=false;
添加(event.getX());
添加(event.getY());
objects1.add(v1);
打破
案例2://移动
motionevent=true;
xendpoint=(int)event.getX();
yendpoint=(int)event.getY();
打破
}
//如果(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=getResources().getDisplayMetrics();
使无效();
返回true;
}
@凌驾
public void clearData(){
//TODO自动生成的方法存根
系统错误打印号(“hi m”);
this.objects.clear();
this.objects1.clear();
System.out.println(“对象值”+OBJECTS.size()+“/”+objects1.size());
清楚=正确;
系统错误打印项次(清除+清除);
//后验证();
//onDraw(帆布);
}
@凌驾
公共无效表面更改(表面文件夹持有者,整型格式,整型宽度,
整数高度){
系统错误println(“Srface变更”);
//TODO自动生成的方法存根
}
@凌驾
已创建的公共空白表面(表面持有人){
//TODO自动生成的方法存根
System.out.println(“创建的曲面”);
如果(!mThread.isAlive()){
mThread=新视图线程(此);
mThread.setRunning(true);
mThread.start();
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
//TODO自动生成的方法存根
}
类ViewThread扩展线程{
P