2016-02-13 69 views
2

我有一個捕捉touchEvents的surfaceview,然後在畫布上繪製一個點。但是當我觸摸時,SurfaceView會從紅色變成黑色,而不是繪製一個點。請看看我的代碼:SurfaceView在繪製時會變黑

GamemodeClassic.java

public class GamemodeClassic extends AppCompatActivity implements Runnable, View.OnTouchListener { 

private SurfaceView view; 

private GameClassic game; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.activity_gamemode_classic); 

    init(); 
} 

public void init() { 
    view = (SurfaceView) findViewById(R.id.classic_view); 
    game = new GameClassic(this); 
    view.getHolder().addCallback(game); 
    view.setOnTouchListener(game); 
} 

@Override 
public void run() { 

} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    return true; 
} 
} 

GameClassic.java

public class GameClassic extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener { 

SurfaceHolder mainHolder; 

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

    setFocusable(true); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    mainHolder = holder; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    initDraw(holder); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

} 

public void initDraw(SurfaceHolder holder) { 
    Canvas canvas = mainHolder.lockCanvas(); 
    if(canvas == null) { 
     Log.v("testlog", "GameClassic.java - Canvas not available"); 
    }else{ 
     Log.v("testlog", "GameClassic.java - Canvas found, drawing"); 
     canvas.drawRGB(255, 0, 0); 
    } 

    holder.unlockCanvasAndPost(canvas); 
} 

public void drawPoint(float x, float y) { 
    Canvas canvas = mainHolder.lockCanvas(); 

    if(canvas != null) { 
     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.BLUE); 

     canvas.drawPoint(x, y, paint); 

     mainHolder.unlockCanvasAndPost(canvas); 
    }else{ 
     Log.v("testlog", canvas + ""); 
    } 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    Log.v("testlog", event.getAction() + "sfsfsf"); 

    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
     drawPoint(event.getX(), event.getY()); 
     Log.v("testlog", "drawing point on (" + event.getX() + ";" + event.getY() + ")"); 
    } 
    return true; 
} 
} 

在此先感謝

編輯 事實證明,我有將行holder.unlockCanvasAndPost(canvas)更改爲mainHolder.unlockCanvasAndPost(canvas)。仍然沒有改進,但是當我嘗試使用drawPoint中的canvas.drawRGB()更改surfaceview的顏色時,它可以工作。然而,繪製點仍然會將表面視圖變爲黑色。

+0

檢查這個答案:http://stackoverflow.com/questions/21311573/surfaceview-shows-black-screen-android/42304462#42304462 –

回答

0

當您覆蓋onTouch()時,您需要致電super.onTouch()。可能是問題。

+0

onTouch()不需要超級,它只需要返回true或false 。 onTouchEvent()然而,確實需要super.onTouchEvent()。 –

+0

http://stackoverflow.com/questions/28979683/android-surfaceview-not-responding-to-touch-events – speirs23

+0

我看過那篇文章,它解決了我之前遇到的問題,但我的方法正在工作:它打印如預期的那樣。但是,當我第一次觸摸表面視圖時,它會變黑,並保持黑色。 –

0

顯然,當您鎖定畫布並在其上繪製時,整個畫布會重置爲其默認顏色,即黑色。當你在上面畫一個點時,藍色幾乎看不見,這導致我認爲整個屏幕變得變黑了。在點之前重新繪製背景是解決方案。

+0

嗯,不。表層是雙緩衝或三緩衝。您需要更新髒區域內的每個像素;如果在鎖定曲面時未指定髒區域,則必須重繪所有內容。屏幕「重置」爲黑色,因爲您已翻轉到從未繪製過的緩衝區。 – fadden