Я пытаюсь создать конкретную программу рисования с помощью прозрачного 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();
}
}
Это мерцает, потому что поверхность двойной буферизации. Вам нужно стереть весь грязный прямоугольник и перерисовать все видимые объекты в каждом кадре или использовать растровое изображение вне экрана и скопировать его на каждый кадр. Ваш ответ выглядит так: он использует растровое изображение вне экрана, которое полностью стирает каждый кадр. Было бы более эффективно делать то или другое. – fadden