2012-03-03 5 views
3

뷰에 선을 애니메이트하고 싶었습니다. 예 : (0,120)에서 시작하여 최대 (100,120)까지 진행되는 선입니다. 나는 plain canvas.drawLine()으로 이것을 시도했지만 라인을 그리는 동안 애니메이션을 적용 할 수 없었다. 내가보기를 원하는 것은 뷰에 뷰에 그려지는 일련의 직선 (다양한 길이)이로드되면 볼 수 있습니다. 나는 그들을 정적 인 선으로 바라지 않는다. 캔버스에 그려지는 선들을보고 싶었습니다.안드로이드에서 drawline에 애니메이션 적용하기

모양 드로어를 사용하고 anim/xml에서 애니메이션을 적용하는 것과 같은 몇 가지 다른 옵션을 시도해 보았습니다. 그들 대부분은 내 문제를 해결하지 못했습니다. 광범위한 검색 기능은 조회수에 직접 적용되는 애니메이션을 보여줍니다. 여기에서는 뷰에 6 개의 선을 갖게 될 것이므로 여러 선으로 각각 다른 색상으로 애니메이션을 적용해야하므로 여러 이미지 뷰를 만들고 싶지 않습니다.

미래에는 줄을 위아래로 이동하고 그 줄마다 색상을 변경하고 다른 종류의 애니메이션을 수행 할 수 있어야합니다.

위 제약 조건을 기억하면 동일한 사용자 지정 구현을 작성하는 방법을 제안 할 수 있습니다.

답변

0

그냥 canvas.drawline (...)이나 canvas.drawlines (...)를 사용하는 것이 아니라면, 여러분의 뷰는 라인을 나타내는 변수를 가질 수 있습니다. 아마도 포인트 또는 뭔가의 arraylist 일 수 있습니다. 저는 현재 제가 만들고있는 게임에서 가치를 움직이는 라인을 그리려고합니다. 간단히 drawline 함수에 넣은 값을 변경하면 해당 값이 변경 될 때마다 내 선이 움직입니다. 그러나 라인이 1에 가까워지면 루프가 느려지고 다른 애니메이션은 느리게 움직입니다. 선 애니메이션을 적용 할 때 비슷한 문제가 있습니까? 또는 당신은 그 (것)들을 당길 수 없는가? 문제는 게임 루프처럼

+0

필자의 라인이 애니메이션을 늦추는 이유는 페인트의 다양한 변경 때문입니다 .setMaskFilter – tantonj

+0

변수를 포인트로 유지하는 것이 cavnas에 그려지는 선을 잡는 것이 좋습니다. 내 주요 문제는 선을 그리는 동안 애니메이션을 할 수 없다는 것입니다. 이전에 말한 것처럼 캔버스에 그려지는 선의 애니메이션을보고 싶었습니다. onDraw() 메서드에서 invalidate()를 호출하여 현재 애니메이션을 완성했습니다. 그러나이 해결책은 매우 나쁘고 부진한 것처럼 보입니다. 그래서 저는 현재 라인을 그릴 수 있고 포인트가 변수에 저장 될 때 라인을 보류 할 수있는 상태에 있습니다. 그러나 쉬운 방법으로 라인에서 애니메이션을 일부 수행 할 수 없습니다 .Invalidate() 옳은 것 같다. –

0

은 ... 나는 무효화() 일이 작업을 얻을 수 있었다 결코로 ... 나는 나의 추첨 및 업데이트 방법을 통해 루프 스레드를 사용하는 소리

그래서 아래에, 그것은 그것이 당신의 업데이 트를 호출하고 onTouch 단지를 오버라이드 (override)에 대한 approprietly 방법을 그릴 것이 스레드를 사용하여 ...

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class MainThread extends Thread { 


// desired fps 
private final static int MAX_FPS = 75; 
// maximum number of frames to be skipped 
private final static int MAX_FRAME_SKIPS = 0;  
// the frame period 
private final static int FRAME_PERIOD = 1000/MAX_FPS; 

// Surface holder that can access the physical surface 
private SurfaceHolder surfaceHolder; 
// The actual view that handles inputs 
// and draws to the surface 
private DrawView gamePanel; 

// flag to hold game state 
public boolean running; 
public void setRunning(boolean running) { 
    this.running = running; 
} 

public MainThread(SurfaceHolder surfaceHolder, DrawView gamePanel) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.gamePanel = gamePanel; 
} 

@Override 
public void run() { 
    Canvas canvas; 

    long beginTime;  // the time when the cycle begun 
    long timeDiff;  // the time it took for the cycle to execute 
    int sleepTime;  // ms to sleep (<0 if we're behind) 
    int framesSkipped; // number of frames being skipped 

    sleepTime = 0; 

    while (running) { 
     canvas = null; 
     // try locking the canvas for exclusive pixel editing 
     // in the surface 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       beginTime = System.currentTimeMillis(); 
       framesSkipped = 0; // resetting the frames skipped 
       // update game state 
       this.gamePanel.doUpdate(); 
       // render state to the screen 
       // draws the canvas on the panel 
       this.gamePanel.doDraw(canvas);    
       // calculate how long did the cycle take 
       timeDiff = System.currentTimeMillis() - beginTime; 
       // calculate sleep time 
       sleepTime = (int)(FRAME_PERIOD - timeDiff); 

       if (sleepTime > 0) { 
        // if sleepTime > 0 we're OK 
        try { 
         // send the thread to sleep for a short period 
         // very useful for battery saving 
         Thread.sleep(sleepTime);  
        } catch (InterruptedException e) {} 
       } 

       while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) { 
        // we need to catch up 
        this.gamePanel.doUpdate(); // update without rendering 
        sleepTime += FRAME_PERIOD; // add frame period to check if in next frame 
        framesSkipped++; 
       } 
      } 
     } catch(ClassCastException cce) { 

     }finally { 
      // in case of an exception the surface is not left in 
      // an inconsistent state 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } // end finally 
    } 
} 

} 

서피스 뷰 SurfaceView가 DrawView이라고이 경우 귀하의 서피스 뷰 SurfaceView에서 클래스라는 mainthread 생성됩니다 Surfaceview (DrawView)의 onTouch 메서드를 사용하여 정상적으로 액세스 할 수 있습니다. 어떤 이유에서든 실행을 거짓으로 설정하기 위해 스레드를 중지하기 위해서.

관련 문제