2011-04-29 3 views
1

ScrollView 내에서 다운로드 한 이미지 나 텍스트로 채워지는 여러 LinearLayouts가 있습니다. LinearLayouts에는 LayoutAnimation이 적용되어 있기 때문에 각 LineAnimation이 그려 질 때 "슬라이드"됩니다. 오프 스크린 LinearLayouts를 강제적으로 그리는 방법이 있을까? 그래서 사용자가 스크롤하여 애니메이션이 이미 완료되었습니다. 그래서 같은 각 뷰 측정 시도했다 : (컨테이너는 뷰 그룹이다)ViewGroup에서 화면을 강제로 해제하려면 어떻게합니까?

int measuredWidth = View.MeasureSpec.makeMeasureSpec(LayoutParams.FILL_PARENT, View.MeasureSpec.AT_MOST); 
int measuredHeight = View.MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); 
container.measure(measuredWidth, measuredHeight); 
container.layout(0, 0, container.getMeasuredWidth(), container.getMeasuredHeight()); 
container.requestLayout(); 

을하지만 그들은 일반적으로 잘하지만 애니메이션을 만드는 (스크롤하는 동안 화면에 나타날 때까지 그들은 여전히 ​​그릴하지 않습니다. . 어, 괜찮아요)

답변

0

, 여기에 내가하고 결국 무엇을 : 나는있는 LinearLayout을 서브 클래스 및 레이아웃이 채워집니다 순간에 화면에 현재 경우에만 애니메이션을 적용하려면 onLayout 오버라이드 :이 실제로 저장

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
{ 
    super.onLayout(changed, left, top, right, bottom); 

    // only animate if viewgroup is currently on screen 
    int[] xy = new int[2]; 
    this.getLocationOnScreen(xy); 
    int yPos = xy[1]; 

    if (yPos < availableScreenHeight && bottom > 200) 
    { 
     Animation slide_down = AnimationUtils.loadAnimation(getContext(), R.anim.container_slide_down); 
     LayoutAnimationController controller = new LayoutAnimationController(slide_down, 0.25f); 
     this.setLayoutAnimation(controller); 
    } 
} 

애니메이션을 보드 전체에 적용하지 않아서 필요없는 뷰에서 애니메이션을 제거하기 때문에 약간의 사이클이 소요됩니다. (BTW "availableScreenHeight"은 바로 그 것이며, "200"은 채워진 뷰가 결코 작아지지 않을 것이라는 임계 값입니다. 귀하의 경우는 다를 수 있습니다.)

1

애니메이션을 실행하고 싶지 않다면 단순히 애니메이션을 제거하지 않으시겠습니까? 프레임 워크는 애니메이션을 적용하기 때문에 애니메이션을 적용합니다.

코드에 의해 다시 그리기가 발생하지 않습니다. draw하려면 invalidate() 또는 draw()를 호출해야합니다.

미래의 독자
+0

애니메이션이 도착하면 뷰 그룹에 표시하고 싶습니다. 다운로드 한 데이터로 채워집니다. 즉, 화면에 표시되면 애니메이션이 표시됩니다. 그 시간에 화면이 꺼지면 그렇지 않습니다. 또한 특정 뷰 그룹이 주어진 시간에 화면 상에 나타나거나 꺼지는 것을 가정 할 수 없기 때문에 뷰 그룹은 어떤 순서로도 될 수 있습니다. 가장 쉬운 방법은 다운로드가 완료되면 어디서든 다운로드하도록 강요하는 것입니다. 두 번째 부분에 관해서는 - 나는 container.invalidate()를 시도했지만 운은 보지 못했습니다. 참조 할 canvas가 없기 때문에 draw()를 사용할 수 없습니다. 단지 뷰 그룹입니다. – wirbly

+0

끝날 때 애니메이션을 삭제하십시오. –

+0

그러나 안드로이드는 화면 상에 나타날 때까지 애니메이션을 시작하지 않습니다. (내 경우에는보기로 스크롤됩니다.) 그래서 사용자가 이미 보았 기 때문에 애니메이션이 끝날 때까지 기다리는 것이 너무 늦었습니다. 애니메이션이 화면 밖에서 발생하지 않습니다. – wirbly

관련 문제