2013-02-27 1 views
-2

저는 기타 응용 프로그램의 개발을 시작했으며 그래픽 측면에 집착하고 있습니다. 내 화면에는 위아래로 슬라이드하여 두 손가락으로 이동할 수있는 배경 이미지가 있습니다. 내 배경 이미지, 비트 맵, 안드로이드 장치에서 낮은 fps로 이동합니다. 나는 그것이 더 매끄럽게 달리는 방법을보기를 기대하고있다.안드로이드 앱 (애니메이션)을보다 빠르고 부드럽게 만드는 방법은 무엇입니까?

코드 세부 사항 : 나는 3 개의 클래스를 가지고 있습니다 : 하나의 주 활동, 그래픽을위한 두 번째, 그리고 스플래시 스크린의 세 번째입니다 (나는 마지막 문제를 내 문제와 관련이 없기 때문에 포함하지 않았습니다).

는 MainActivity.java

package com.example.androidapplication; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 


public class MainActivity extends Activity implements OnTouchListener{ 

    FretBoard ourView; 
    float y1, y2, dy; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     ourView = new FretBoard(this); 
     ourView.setOnTouchListener(this); 
     setContentView(ourView); 

    } 

    //Method to be used in future 
    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     ourView.pause(); 
    } 

    //Method to be used in future 
    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     ourView.resume(); 
    } 



    @Override 
    public boolean onTouch(View v, MotionEvent event){ 

     //For debugging 
     if(event!= null) ourView.fingerCount = event.getPointerCount(); 

     switch(event.getAction()){ 

      case MotionEvent.ACTION_DOWN: 

       //Save first y position when finger touches screen 
       y1 = event.getY(); 

       break; 


      case MotionEvent.ACTION_MOVE: 

       if(event != null && event.getPointerCount() == 2){ 

        //Save second y position when finger moves 
        y2 = event.getY(); 

        //Total distance moved 
        dy = y2 - y1; 
        if((ourView.bgY + dy)<0) ourView.bgY += dy/2; 

        //For Debugging 
        System.out.println("Y1 : " + y1 + "  Y2 : " + y2    + " DY : " + dy); 

        //Redraw the Screen 
        ourView.invalidate(); 

        //Reset y1 
        y1 = y2; 
       } 

       break; 
     } 
     return true; 
    } 

} 

FretBoard.java 당신이/읽기를로드하고 각 비트 맵을 확장하는 것

package com.example.androidapplication; 

import java.io.InputStream; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


public class FretBoard extends SurfaceView implements Runnable{ 

    //Background image variables 
    Bitmap background; 
    InputStream is = getResources().openRawResource(R.drawable.fret_board); 

    //Debugger text variables 
    Paint mPaint = new Paint(); 
    String string = "Fingers: "; 
    int fingerCount = 0; 

    //Position Variables 
    int width, height; 
    float bgY = 0, bgX = 0; 

    //Holder variable 
    SurfaceHolder ourHolder; 

    //To be used in future 
    Thread ourThread = null; 
    Boolean isRunning = false; 

    public FretBoard(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
     ourHolder = getHolder(); 
     ourThread = new Thread(this); 
     ourThread.start(); 

    } 

    //To be used in the future 
    public void pause(){ 
     isRunning = false; 
     while(true){ 
      try { 
       ourThread.join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      break; 
     } 
     ourThread = null; 
    } 

    //To be used in the future 
    public void resume(){ 
     isRunning = true; 
     ourThread = new Thread(this); 
     ourThread.start(); 
    } 


    //Creates a InputStream to set width, then converts to bitmap to be 
    //drawn as background on the canvas. 
    public Bitmap bmScale(InputStream is){ 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inSampleSize = 2; 
     Bitmap bit = BitmapFactory.decodeStream(is, null, o); 
     background = Bitmap.createScaledBitmap(bit, width, 2300, true); 
     bit.recycle(); 
     return background; 
    } 


    //This is the draw method where I need help 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while(isRunning){ 
      if(!ourHolder.getSurface().isValid()) continue; 

      //Lock canvas to draw 
      Canvas canvas = ourHolder.lockCanvas(); 

      //Do Things Here: 
      width = getWidth(); 
      height = getHeight(); 

      //Collision detection for the background 
      if(bgY > 0) bgY = 0; 

      //Draws the background 
      bmScale(is); 
      canvas.drawBitmap(background, bgX, bgY, null); 

      //For debugging, displays the number of fingers on the screen 
      canvas.drawText(string + fingerCount, 50, 50, mPaint); 

      //Unlock canvas to show 
      ourHolder.unlockCanvasAndPost(canvas); 
     } 
    } 
} 
+1

여성이라면 더 많은 사람들이 도움이 될 것이라고 생각하십니까? –

+1

더 일반적으로 Traceview를 사용하여 시간을 어디에서 보내고 있는지 파악하면 수정할 필요가있는 사항을 알 수 있습니다. – CommonsWare

+0

다음 질문에 대해서는 귀하의 질문과 관련된 정보 만 제공하십시오. 여성이되거나 뭔가를 능숙하게하는 것은 자제 될 수 있습니다. –

답변

3

는 패스를 렌더링합니다. 이것은 엄청나게 비효율적이다. (FretBoard.java의 bmScale(is); 호출 참조).

대신 비트 맵을 한 번만로드하고 뷰를 배치 한 다음 이미로드되고 크기가 조정 된 비트 맵을 그립니다.

또한 FretBoardSurfaceView을 사용하는 것 같습니다. 왜? 코드 샘플에서는 OpenGL 또는 Video/Camera 텍스처를 전혀 사용하지 않습니다.

+0

'SurfaceView'에는 이와 같은 간단한 문제가 없습니다. 실제 애니메이션이 거의없는 것처럼 보이므로 성능 차이가 끔찍하지 않아야합니다. 그래도 스케일링에 대한 귀하의 의견에 자리하고 있습니다. – kabuko

0

루프의 스케일링 (다른 답변에서 언급 한 것처럼)은 확실히 중요한 문제입니다. 일단 문제를 해결하면 상황이 훨씬 원활 해집니다. 루프에 다른 객체, 즉 문자열을 생성하기 때문에 여전히 약간의 단점이있을 수 있습니다. 한 번에 핑거 보드에 5 개 이상의 손가락을 가지지 않는다는 것을 감안할 때 string에 대해 5 개 또는 10 개의 가능한 값만있는 경우 (이론상으로 10 개를 탭하면 이론적으로 10 개가됩니다) (이 방법은 특히 혼란스러운 이름입니다. 문맥). 루프 외부에서 앞면을 만들고 올바른 참조를 선택하는 것이 좋습니다.