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