2012-09-01 3 views
3

나는 라이브 벽지를 연구하고 있었다. 하지만 먼저 캔버스 애니메이션을 공부해야합니다. 여기에 코드가 있는데 괜찮습니다. 그것은 math.random()을 사용합니다. 하지만 내가 원한 것은 이것과 같은 것이다. enter image description here캔버스 임의의 움직임

여기에서 이미지는 위에서 설명한 경로처럼 움직이기를 원합니다. 내 생각은 x와 y에 math.random을 사용하는 것이다. 그러나 그것을 사용하는 문제는 이미지가 화면의 어느 곳에 나 나타납니다. 나는 임의의 경로를 만들기 위해 이미지를 원한다. x와 y 좌표에 대해 알고 있지만 경로가 임의로 트리거되는 방식을 생각할 수 없습니다. 나는 실제로 그것을 설명 할 수 없다. 그러나 튀는 공에 대해 아는 경우 공에는 임의의 공동이 있습니다. 그냥 그렇게. 여기 내 코드가있다.

public class MainActivity extends Activity { 

    private Game game; 
    public Handler updateHandler = new Handler(){ 
      /** Gets called on every message that is received */ 
      // @Override 
      public void handleMessage(Message msg) { 
       game.update(); 
       game.invalidate(); 
       super.handleMessage(msg); 
      } 
     }; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     game = new Game(this); 
     setContentView(game); 

     Thread myThread = new Thread(new UpdateThread()); 
     myThread.start(); 
    } 

    public class UpdateThread implements Runnable { 

     @Override 
     public void run() { 

      while(true){ 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       MainActivity.this.updateHandler.sendEmptyMessage(0); 
      } 
     } 

    } 

} 


public class Game extends View { 

    private Bitmap image; 
    private Paint paint; 
    private int x=0; 

    public Game(Context context) { 
     super(context); 
     image = Bitmap.createBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher)); 
     paint = new Paint(); 
    } 

    // called every Frame 
    protected void onDraw(Canvas canvas) { 

     canvas.drawBitmap(image, x, 0, paint); 
    } 

    // called by thread 
    public void update() { 
      x = 1; 
      x += Math.random() * 100; 

    } 

} 

당신이 나를 도울 수 있기를 바랍니다. .. 감사합니다.

+0

ahm. 베 지어 곡선? 그것을 사용하거나하는 방법에 대한 링크가 있습니까? 고맙습니다. – thenewbie

+0

[Cubic Hermite splines] (http://en.wikipedia.org/wiki/Cubic_Hermite_spline)을 공부하면 나중에 나오는 것과 비슷한 부드러운 경로를 생성하는 가장 쉬운 방법이 될 수 있습니다. – harism

+0

그것의 수학. :) 매끄러운 곡선을 치워. Ahm 무작위로 x와 y 값을 다른 방향으로 이동시키는 방법을 알고 있습니까? 예를 들어 그냥 직선으로 움직이는 것을 제외하고? – thenewbie

답변

4

다음은 무한 선형 보간 루프 코드입니다 (나중에 부드러운 곡선으로 변경해야 할 수도 있음).

PointF mImagePos = new PointF(); 
PointF mImageSource = new PointF(); 
PointF mImageTarget = new PointF(); 
long mInterpolateTime; 

protected void onDraw(Canvas canvas) { 
    canvas.drawBitmap(image, mImagePos.x, mImagePos.y, paint); 
} 

public void update() { 
    final long INTERPOLATION_LENGTH = 2000; 
    long time = SystemClock.uptimeMillis(); 
    if (time - mInterpolateTime > INTERPOLATION_LENGTH) { 
     mImageSource.set(mImageTarget); 
     mImageTarget.x = (float)(Math.random() * 100); 
     mImageTarget.y = (float)(Math.random() * 100); 
     mInterpolateTime = time; 
    } 

    float t = (float)(time - mInterpolateTime)/INTERPOLATION_LENGTH; 
    // For some smoothness uncomment this line; 
    // t = t * t * (3 - 2 * t); 

    mImagePox.x = mImageSource.x + (mImageTarget.x - mImageSource.x) * t; 
    mImagePos.y = mImageSource.y + (mImageTarget.y - mImageSource.y) * t; 
} 
+0

정말 고마워요. :) – thenewbie

+0

+1. "setContentView (R.layout.MyLayout)"를 설정 한 후 애니메이션을 백그라운드 애니메이션으로 다른 레이아웃에 추가하는 방법에 대한 아이디어가 있습니까? 왼쪽에서 오른쪽으로 가로 지르는 화면 아래쪽에 유사한 애니메이션이 필요합니다. 고맙습니다. –