2014-03-05 4 views
4

배경 : 내 응용 프로그램에는 자식보기 위에 그림자를 그릴 때 사용하는 컨테이너 인 DropShadowFrameLayout이 있습니다. ListView의 상단과 하단에있는 그림자처럼 알 수 있습니다.ViewPager의 그림자 그림자

그것은이 문서를 기반으로 : 그것은 단순히 아이들의 이상 그림자 비트 맵을 그릴 수 dispatchDraw(Canvas canvas)을 무시 http://cyrilmottier.com/2012/06/08/the-making-of-prixing-3-polishing-the-sliding-app-menu/

: http://proandroiddev.blogspot.ru/2012/01/android-design-tip-drop-shadows-on.html

시릴 Mottier도 같은 접근 방식을 제안한다.

나는 DropShadowFrameLayout 안에 VerticalViewPager (https://github.com/castorflex/VerticalViewPager)을 가지고 있으며,보기의 계층 구조가 이미 복잡하여 화면이 흐려지는 문제가 있습니다. 내가 뭘하려

:은 내가 ViewPagerdispatchDraw(Canvas canvas)에 직접 그림자 그리기 코드를 이동하여 해당 DropShadowFrameLayout 제거하기로 결정했다. 그리고 여기서 문제는 ViewPager은 처음에 보이는 자식에만 그림자를 그립니다. 그리고 스크롤 할 때 그림자도 함께 움직입니다. 물론 이것은 자식 뷰가 움직이는 동안 그림자가 있어야하기 때문에 예상 한 동작이 아닙니다.

이 방법은 ListView에서 잘 작동합니다.

질문 :이 방법을 ViewPager에 어떻게 적용합니까? 아니면 성능면에서 동등한 다른 방법이 있습니까? 또는 적어도, ViewPager은 왜 이런 식으로 행동합니까?

+2

그래서 ViewPager.dispatchDraw는 한 번만 호출됩니다. ??? – pskink

+0

아니요, 여러 번 호출되었지만 그림자가 같은 위치에 그려져 있습니다. (어린이가 아닌 그려진 것처럼) –

+1

getScrolllX/Y로 캔버스 번역 – pskink

답변

0

문제 DropShadowFrameLayout에 그림자가 항상 고정 위치에 그려진 것이였다

ViewPager

private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, 0, canvas.getWidth(), bm.getHeight()); } 그의 내부 좌표를 사용 판명되므로 용액 현재 인식이 방법을 조정했다 ViewPager의 스크롤 위치 (I 실제로 VerticalViewPager을 사용하기 때문에 내가 대신 X의 Y를 사용하지만 원리는 모두 동일) :

private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, getScrollY(), canvas.getWidth(), getScrollY() + bm.getHeight()); }

또는 그림을 그리기 전에 canvasgetScrollY()로 번역하면됩니다 (덕분에 pskink).

또한 스크롤 지연은 dispatchDraw()에서 매번 Bitmap을 얻음으로써 (부분적으로) 발생했습니다.