2016-04-13 71 views
0

ile hareketli bir çizgiyi canlandırmak için yardıma ihtiyacınız var Alttan başlayıp ekran boyutunun yarısına kadar giden drawLine yöntemiyle bir hat yaptım. Şimdiye kadar çok iyi. Şimdi ekrana basıldığında çizgiyi sola veya sağa “yatırmak” istedim. Resimde böyle şey:OnDraw() - JAVA

enter image description here

Ve basıldığında yine benzeri diğer tarafa geri eğin ve var. Şu an sahip olduğum problem, çizgiyi eğerken "izi" nin görünmesidir, çünkü birden çok kez drawLine yöntemini çağırıyorum. Ben herhangi bir fikir arıyorum

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); 
}} 

:

Bu

benim kodudur. Buna yanlış şekilde mi teşebbüs ettim? Yolu nasıl görünmez yapabilirim? Herhangi bir yardım için minnettarım. Teşekkür ederim.

+1

@NaN Yeni kullanıcılar beaker

cevap

0

Patikayı ortadan kaldırmak için eski tuvali (eski bitmap'i daha hassas bir şekilde) atmanız ve yeni bir tane oluşturmanız gerekir. Örnekte i öneririm:

@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); 
      } 
     } 
    } 
} 

ve

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