2011-06-14 81 views
0

我現在有(其中包括)這些類:舉止怪異與Android的。睡眠動畫()的onTouchEvent

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,睡眠...等...

回答

0

我已經遇到了相同的問題,觸摸放慢速度,結束了與你類似的方法(在觸摸事件中睡覺UI線程,as recommended by a Google game developer)。似乎幫助我的東西是在睡眠時間的長短。嘗試增加到70毫秒甚至更多,看看是否有幫助。大多數應用程序不需要超高採樣率的觸摸輸入。

0

首先,你應該初始化面板的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()處理程序做了睡眠。試着把它拿出來,事情應該加快,特別是如果你認爲這可能是原因!

+0

哦,初始化問題來自舊代碼。編輯我的問題來回答你的最後一個問題。 – usealbarazer 2011-06-14 16:32:34

+0

so ...任何人? ... – usealbarazer 2011-06-14 17:02:16

+0

做一些其他方式的防洪保護,也許只是偶爾調用p.onTouchEvent()。阻止用戶界面線程是一個非常糟糕的主意,只會讓你的應用看起來呆滯,並且可能會產生一些其他不良效果,例如降低幀速率。 – 2011-06-14 17:29:01