Android анимация работает странно с .sleep () на TouchEvent - PullRequest
0 голосов
/ 14 июня 2011

В настоящее время у меня есть (среди прочих) эти классы:

public class Main extends Activity {

Panel p;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    p = new Panel(this);
    setContentView(p);
    }

@Override
public boolean onTouchEvent(MotionEvent event) {
    p.onTouchEvent(event);
    // Make your UI thread sleep.
    try {
        Thread.sleep(30);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return true;


}

и

public class Panel extends SurfaceView implements SurfaceHolder.Callback {

private ViewThread mThread;
private ArrayList<GraphicsElement> mElements = new ArrayList<GraphicsElement>();
public static int panelHeight;
public static int panelWidth;
private int numberOfElements = 0;
private Paint mPaint;

public Panel(Context context) {
    super(context);
    getHolder().addCallback(this);
    mThread = new ViewThread(this);
    mPaint = new Paint();
    mPaint.setColor(Color.CYAN);
    mPaint.setTextSize(20);
}

public void doDraw(long elapsed, Canvas canvas) {
    canvas.drawColor(Color.parseColor("#003045"));
    if (!(mElements.size() > 15)) {
        synchronized (mElements) {
            for (GraphicsElement element : mElements) {
                element.doDraw(canvas);
            }
            canvas.drawText("FPS: " + Math.round(1000f / elapsed) + " Elements: " + numberOfElements, 10, 30, mPaint);
        }
    } else {
        mElements.clear();
        numberOfElements = 0;
    }
}

public void animate(long elapsedTime) {
    synchronized (mElements) {
        for (GraphicsElement element : mElements) {
            element.animate(elapsedTime);
        }
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();
    int xspeed = 0;
    int yspeed = 0;

    if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {

        if (event.getX() > panelWidth / 2) {
            xspeed = 5;
        } else if (event.getX() < panelWidth / 2) {
            xspeed = -5;
        }

        synchronized (mElements) {
            for (GraphicsElement element : mElements) {
                element.changeSpeed(xspeed, yspeed);
            }
        }
    }
    return true;
}

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

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (!mThread.isAlive()) {
        mThread = new ViewThread(this);
        mThread.setRunning(true);
        mThread.start();
    }
    mElements.add(new GraphicsElement(getResources(), 80, 300));
    numberOfElements += 1;
}

public void surfaceDestroyed(SurfaceHolder holder) {

У меня также есть ViewThread, только мой поток анимации, и GraphicsElement, который определяет движущийся объект. Моя анимация идет очень медленно (на ощупь), и я думаю, что это как-то связано с моим методом .sleep (). Может ли кто-нибудь помочь мне?

Редактировать: я использую .sleep (), потому что я не хочу заливать TouchEvents. я пытаюсь получить это как: Проверить TouchEvent, Спать, Проверить TouchEvent, Спать ... и т.д ...

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

У меня были те же проблемы с сенсорным замедлением, и в итоге я применил такой же подход к вашему (спящий поток пользовательского интерфейса на сенсорных событиях, в соответствии с рекомендациями разработчика игр Google ).Вещь, которая, казалось, помогла мне, играла с продолжительностью сна.Попробуйте увеличить его до 70 мс или даже больше и посмотрите, поможет ли это.Большинству приложений не требуется сверхвысокая частота дискретизации для сенсорного ввода.

0 голосов
/ 14 июня 2011

Во-первых, вы должны инициализировать вашу Panel внутри вашего onCreate() метода.

Panel p = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    p = new Panel(this);
    setContentView(p);
}

Во-вторых, я не понимаю , почему вы спите в своем onTouchEvent() обработчике. Попробуйте убрать это, и все должно ускориться, особенно если вы думаете, что это может быть причиной!

...