Я пытаюсь сделать меню на основе растровых изображений. Само меню должно перемещаться через события перемещения screentouch, в основном я хочу перетащить кнопки вокруг на вид. Кнопка также включает обнаружение столкновения, поэтому всякий раз, когда они касаются друг друга, они отскакивают друг от друга.Мерцание при рисовании растровых изображений с холстом в Android
Но у меня есть некоторые проблемы, когда дело доходит до рисования моих растровых изображений. В настоящее время я использую прямоугольник для масштабирования растрового изображения, чтобы оно соответствовало окну моего устройства. Хочу, чтобы я хотел и не могу получить в настоящее время для более плавного перемещения моих растровых изображений без мерцания. Единственная возможность перейти к открытию gl? Или я пропустил что-то большое в своем коде?
Это в моем представлении поверхности для рисования каждой кнопки, где MenuButton - это класс, который содержит растровое изображение и обновляет его положение в соответствии с движением касания и перетаскивания.
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
for(MenuButton menuButton : menuButtonSprites) {
menuButton.onDraw(canvas);
}
}
Я хочу растровые изображения для масштабирования по ширине каждого устройства, и для этого я использую прямоугольник для растрового изображения, чтобы поместиться в.
public MenuButton(MenuView v, Bitmap bmp, int yPosition){
this.menuView = v;
this.menuButton = bmp;
this.xMax = v.getWidth();
this.yPosistion = yPosition;
menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax);
}
public void update(int y){
if(menuButtonPressed)
{
this.yPosistion = y;
menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax);
}
}
public void onDraw(Canvas canvas){
canvas.drawBitmap(menuButton, null, menuButtonRectangle, null);
}
У меня есть поток, который обновляет жеребьевку
public void run() {
long ticksPS = 1000/FPS;
long startTime;
long sleepTime;
Canvas c = null;
while (running) {
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
}
finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
}
catch (Exception e) {
}
}
}
Я не знаю, что я делаю неправильно и почему я не могу добиться плавного движения моих кнопок. Это недостаток в использовании холста или я пропустил что-то действительно важное: D?
Thx, yep проверили, чтобы настроить частоту кадров, но без каких-либо успехов. Я попробую двойную буферизацию и вернусь к вам! – Ghostcloud
Кажется, что когда вы блокируете холст и рисуете, а затем разблокируете холст с помощью unlockCanvasAndPost (c), вы уже рисуете следующий кадр. [Двойная буферизация] (http://stackoverflow.com/questions/6538423/double-buffering-in-java-on-android-with-canvas-and-surfaceview) – Ghostcloud
О, это хорошо. Спасибо за информацию. lemme переосмыслить эту проблему. – Pavandroid