2016-06-28 2 views
1

내가 오버라이드 (override) onDraw와 사용자 정의 View 있습니다View에 변환을 적용하는 방법은 무엇입니까?

protected void onDraw(Canvas canvas) 
{ 
    canvas.drawPath(m_path, m_paint); 
} 

내가 이동하는 것을 가능하게 할를/규모/뷰를 회전 할 수 있습니다. 사용자가 손가락을 움직일 때마다 다시 그리기를 원하지 않습니다. 내 생각은 사용자 제스처에 대한 응답으로 뷰에 변환 행렬을 적용하는 것입니다.

나는 필요한 것을 할 방법 인 ImageView.setImageMatrix가 있음을 알고 있지만, ImageView이 아니지만 사용자 정의 View이 없습니다.

iOS의 경우 CALayermyLayer.affineTransform = CGAffineTransformMake...을 사용했습니다.

Android에서 어떻게 처리 할 것을 제안 하시겠습니까?

답변

1

당신이 Path을 그리는 경우, 당신은 Matrix 경로에 (안드로이드 아핀 변환 호출로) 적용 할 수 있습니다

사용자 상호 작용에

, 업데이트 할 행렬을, 다음 뷰를 부를 것이다 :

 m_path.transform(m_matrix, m_path_draw); 

그리고 onDraw()에서 Path#transform | Android Developers를 참조하십시오, 당신은 부를 것이다 :

(210)

또는 CanvassetMatrix() 방법이 있습니다

어떠한 방식을 사용하더라도
 canvas.save(); 
     canvas.setMatrix(m_matrix); 
     canvas.drawPath(m_path, m_paint); 
     canvas.restore(); 

, 내가 가지고 추천 할 것입니다 당신의 Matrix 만 사용자 정의보기를 건설하는 동안 한 번을 구성하도록 멤버 변수를합니다.

+0

매트릭스를 적용하는 것은'onDraw'에서 발생합니다, 맞습니까? 즉, 사용자가보기를 팬 할 때마다 다시 그려집니다. 이것이 내가 피하고 싶은 일입니다. 렌더링 된 뷰를 전체적으로 이동하고 싶습니다. – Nick

+0

화면을 다시 그리는 것만이 화면이 변경되는 유일한 방법입니다. 스크롤 할 때마다, 당신이 스 와이프 할 때마다,'onDraw'는 여러 번 호출됩니다. fling을 사용하여 핀치/확대/축소 이미지 컨트롤을 작성했습니다. 즉, 플롯 애니메이션이 업데이트 될 때마다 호출되는 'computeScroll'에 뷰 매트릭스가 설정됩니다. 기본'ImageView'에서, 행렬은'canvas.concat (mDrawMatrix)'를 사용하여 캔버스에'onDraw'에 적용됩니다. fling 애니메이션은 부드럽고 반응이 좋습니다. 퍼포먼스가 걱정된다면 먼저이 방법을 시도해보십시오. 나는 네가 즐겁게 놀랄 것이라 예측한다. –

+0

매트릭스에 관한 그래픽 코드 중 일부를 살펴 보았습니다. 우선, 대부분은 JNI 기본 레이어에서 발생합니다. 모든 레이어는 C/C++로 작성됩니다. 둘째, 행렬 값 자체는 "16.16"이라는 비표준 부동 소수점 형식을 사용하여 저장되며 신속한 산술 계산에 최적화되어 있습니다. Google은 그래픽 작업을 최적화하는 데 엄청난 노력을 기울였습니다. 뷰 변환을위한 행렬 사용은 문제가되지 않습니다. –

관련 문제