2016-04-13 83 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; 
}