【问题标题】:Android animation acting strange with .sleep() onTouchEventAndroid 动画在 .sleep() onTouchEvent 中表现异常
【发布时间】:2011-06-14 16:14:11
【问题描述】:

我目前有(除其他外)这些课程:

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、Sleep、检查 TouchEvent、Sleep.. 等等......

【问题讨论】:

    标签: android animation sleep surfaceview touch-event


    【解决方案1】:

    我在触摸减慢速度方面遇到了同样的问题,最终采用了与您类似的方法(在触摸事件上休眠 UI 线程,as recommended by a Google game developer)。似乎对我有帮助的是睡眠时间的长度。尝试将其增加到 70 毫秒甚至更多,看看是否有帮助。大多数应用不需要超高的触摸输入采样率。

    【讨论】:

      【解决方案2】:

      首先,您应该在 onCreate() 方法中初始化 Panel。

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

      其次,我不明白为什么你在你的 onTouchEvent() 处理程序中睡觉。试着把它去掉,事情应该会加快,尤其是如果你认为这可能是原因!

      【讨论】:

      • 哦,初始化问题来自旧代码。编辑我的问题来回答你的最后一个问题。
      • 以其他方式进行防洪,也许只是偶尔调用 p.onTouchEvent()。阻塞 UI 线程是一个非常糟糕的主意,只会让您的应用看起来迟钝,并且可能会产生一些其他不良影响,例如降低帧速率。
      • 是的,关键是我想知道我应该怎么做……对……☺
      • @MarkAllison 另一方面,为 Google 工作的一位非常聪明的游戏程序员建议像 OP 一样睡觉。他建议通常在 16 到 32 毫秒之间。见youtube.com/…
      猜你喜欢
      • 2012-07-07
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多