2015-09-17 5 views
1

Я пытаюсь создать конкретную программу рисования с помощью прозрачного surefaceView и кисти, сделанной из пользовательского растрового изображения. Я просмотрел этот сайт для ответов, но не смог найти то, что мне нужно.SurfaceHolder вызывает мерцание

Из-за цикла while метода запуска растровые изображения, которые я рисую на экране, мерцают без остановок. Похоже, что программа рисует одни и те же растровые изображения бесконечно, что вызывает это мерцание.

Я собираюсь сохранить каждый ход кисти до event.getAction()==MotionEvent.ACTION_UP как отдельное растровое изображение. Но у меня проблемы с этим.

Это мой код, я был бы признателен за любую помощь в устранении этой проблески!

public class SurfaceMyPaint extends SurfaceView implements Runnable { 

    Thread t; 
    SurfaceHolder holder; 
    Bitmap brush; 
    boolean isItOk = false; 

    public SurfaceMyPaint(Context context) 
     { 
     super(context); 
     holder = getHolder(); 
     initial(); 
     } 
    public SurfaceMyPaint(Context context, AttributeSet attrs, int defStyle) 
      { 
     super(context, attrs, defStyle); 
     holder = getHolder(); 
     initial(); 
     // TODO Auto-generated constructor stub 
      } 

    public SurfaceMyPaint(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     holder = getHolder(); 

     initial(); 
     // TODO Auto-generated constructor stub 
    } 

    public void initial() 
    { 
     brush= BitmapFactory.decodeResource(getResources(), R.drawable.brush2);  
    } 

    public boolean onTouchEvent(MotionEvent event) 
    { 
     if(event.getAction()== MotionEvent.ACTION_DOWN) 
     {    
      x= event.getX(); 
      y= event.getY(); 
     } 

     if(event.getAction()== MotionEvent.ACTION_MOVE) 
     { 
      x = event.getX(); 
      y= event.getY(); 
      Canvas c= holder.lockCanvas(); 
      c.drawBitmap(brush,x- (brush.getWidth()/2),y- (brush.getWidth()/2),null); 
      holder.unlockCanvasAndPost(c); 
     } 
     return true; 
    } 


    public void run() 
    { 
     while (isItOk == true) 
     { 
     if (!holder.getSurface().isValid()) 
      continue; 
     } 
    } 

    public void pause(){ 
     isItOk = false; 
     while (true){ 
      try { 
       t.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
     t=null; 
    } 
    public void resume(){ 
     isItOk = true; 
     t = new Thread(this); 
     t.start(); 
    } 
} 

ответ

0

ОК, я нашел решение, и я отправлю его здесь, чтобы помочь другим. This is the link, который помог мне, и это образец кода, который мне нужен. (его было трудно найти).

public void run() { 
    Canvas canvas = null; 
    while (_run){ 
    try{ 
     canvas = mSurfaceHolder.lockCanvas(null); 
     if(mBitmap == null){ 
     mBitmap = Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);; 
     } 
     final Canvas c = new Canvas (mBitmap); 
     c.drawColor(0, PorterDuff.Mode.CLEAR); 
     commandManager.executeAll(c); 
     canvas.drawBitmap (mBitmap, 0, 0,null); 
    } finally { 
     mSurfaceHolder.unlockCanvasAndPost(canvas); 
    } 
    } 
} 

}

+0

Это мерцает, потому что поверхность двойной буферизации. Вам нужно стереть весь грязный прямоугольник и перерисовать все видимые объекты в каждом кадре или использовать растровое изображение вне экрана и скопировать его на каждый кадр. Ваш ответ выглядит так: он использует растровое изображение вне экрана, которое полностью стирает каждый кадр. Было бы более эффективно делать то или другое. – fadden

 Смежные вопросы

  • Нет связанных вопросов^_^