2016-04-13 39 views
0

我通过drawLine方法创建了一条线,该方法从底部开始并转到屏幕大小的一半。 目前为止这么好。现在我想在按下屏幕时将线条“倾斜”到左侧或右侧。 像这样的画面:需要帮助来使用onDraw()创建动画行 - JAVA

enter image description here

,按下时再次把它向后倾斜到另一侧等。 我现在面临的问题是,当我倾斜线时,它的“踪迹”是可见的,因为我多次调用drawLine方法。

这是我的代码:

public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = MainGamePanel.class.getSimpleName(); 

private MainThread thread; 
private Paint paint; 
private GameLine gameLine; 

public MainGamePanel(Context context){ 
    super(context); 

    getHolder().addCallback(this); 

    setFocusable(true); 
    paint = new Paint(); 
    paint.setStrokeWidth(50); 
    paint.setColor(Color.WHITE); 
    gameLine = new GameLine(getWidth()/2,getHeight(),getWidth()/2, getHeight()/2,paint); 

    thread = new MainThread(getHolder(), this); 
} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    thread.setRunning(true); 
    thread.start(); 
    gameLine = new GameLine(getWidth()/2,getHeight(),getWidth()/2, getHeight()/2,paint); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    ...} 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     gameLine.setTapped(true); 
    } 
    return super.onTouchEvent(event); 
} 

public void render(Canvas canvas) { 
    gameLine.drawTheLine(canvas); 
} 
public void update(){ 
    gameLine.update(); 
}} 

public class MainThread extends Thread { 

private boolean running; 
private MainGamePanel gamePanel; 
private SurfaceHolder surfaceHolder; 

public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel){ 
    super(); 
    this.gamePanel=gamePanel; 
    this.surfaceHolder = surfaceHolder; 
} 

public void setRunning(boolean running){ 
    this.running = running; 
} 
@Override 
public void run(){ 
    Canvas canvas; 
    while (running){ 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder){ 
       this.gamePanel.update(); 
       this.gamePanel.render(canvas); 
      } 
     }finally { 
      if(canvas != null){ 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
}} 
public class GameLine { 

private float startX; 
private float startY; 
private float stopX; 
private float stopY; 
private Paint paint; 
private boolean tapped = false; 


public GameLine(float startX, float startY, float stopX, float stopY, Paint paint) { 
    Normal Constructor 
} 
public boolean getTapped(){ 
    return tapped; 
} 
public void setTapped(boolean tapped){ 
    this.tapped = tapped; 
} 
public void update(){ 
    if(tapped){ 
     this.stopX -=1; 
    } 
} 
public void drawTheLine(Canvas canvas){ 

    canvas.drawLine(startX, startY,stopX, stopY,paint); 
}} 

我正在寻找任何想法。我是否尝试了这种错误的方式? 我怎样才能让小道隐形? 我很感激任何帮助。谢谢。

+1

@NaN新用户<10代表不得直接在他们的问题发表图片,所以对他们的链接是首选方式包含图像。 – beaker

回答

0

为了消除痕迹,您需要扔掉旧的画布(更精确地说是旧的位图)并创建一个新的画布。 在你的榜样,我建议:

@Override 
public void run(){ 
    Canvas canvas; 
    while (running){ 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder){ 
       this.gamePanel.update(); 
       canvas = gameLine.drawTheLine(); 
      } 
     }finally { 
      if(canvas != null){ 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

public Canvas drawTheLine(){ 
    Canvas canvas = new Canvas(); 
    canvas.drawLine(startX, startY,stopX, stopY,paint); 
    return canvas; 
}