2011-06-14 9 views
0
나는 현재 (다른 사람의 사이에서)이

이러한 클래스 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() 메소드와 관련이 있다고 생각한다. 아무도 나를 도울 수 없습니까?

편집 : TouchEvent를 범람시키고 싶지 않기 때문에 .sleep()을 사용하고 있습니다. 내가 그것을 좋아 얻으려고 : TouchEvent, 수면 확인 등 TouchEvent, 수면 ... 확인 ...

답변

0

터치 감속과 관련하여 동일한 문제가 있었지만 유사한 접근 방식으로 종료되었습니다 (터치 이벤트에서 UI 스레드 잠시, as recommended by a Google game developer). 나를 돕는 것처럼 보였던 것은 수면 시간의 길이로 놀고 있었다. 70 밀리 초 또는 그 이상으로 높이고 도움이되는지 확인하십시오. 대부분의 앱은 터치 입력에 대해 초고속 샘플링 속도가 필요하지 않습니다.

0

첫째로, 당신은 당신의 onCreate() 방법 내부에 패널을 초기화해야한다. 당신이 당신의 onTouchEvent() 핸들러에서 잠을하고있는 이유

Panel p = null; 

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

둘째, 나는 을 이해하지 않습니다. 그것을 밖으로 가져 가면, 특히 그것이 원인 일 수 있다고 생각한다면, 일이 가속화되어야합니다!

+0

오, 초기화 문제는 이전 코드에서 발생했습니다. u'r 마지막 ​​질문에 답하기 위해 내 질문을 편집했습니다. – usealbarazer

+0

그래서 ... 누구? .... – usealbarazer

+0

홍수 방지를 다른 방법으로, 가끔 p.onTouchEvent()를 호출하는 것만으로도 가능합니다. UI 스레드를 차단하는 것은 정말 나쁜 생각이며 앱이 느리게 보일뿐 아니라 프레임 속도를 줄이는 것과 같은 다른 바람직하지 않은 효과가있을 수 있습니다. –

관련 문제