내가 오버라이드 (override) onDraw
와 사용자 정의 View
있습니다View에 변환을 적용하는 방법은 무엇입니까?
protected void onDraw(Canvas canvas)
{
canvas.drawPath(m_path, m_paint);
}
내가 이동하는 것을 가능하게 할를/규모/뷰를 회전 할 수 있습니다. 사용자가 손가락을 움직일 때마다 다시 그리기를 원하지 않습니다. 내 생각은 사용자 제스처에 대한 응답으로 뷰에 변환 행렬을 적용하는 것입니다.
나는 필요한 것을 할 방법 인 ImageView.setImageMatrix
가 있음을 알고 있지만, ImageView
이 아니지만 사용자 정의 View
이 없습니다.
iOS의 경우 CALayer
및 myLayer.affineTransform = CGAffineTransformMake...
을 사용했습니다.
Android에서 어떻게 처리 할 것을 제안 하시겠습니까?
매트릭스를 적용하는 것은'onDraw'에서 발생합니다, 맞습니까? 즉, 사용자가보기를 팬 할 때마다 다시 그려집니다. 이것이 내가 피하고 싶은 일입니다. 렌더링 된 뷰를 전체적으로 이동하고 싶습니다. – Nick
화면을 다시 그리는 것만이 화면이 변경되는 유일한 방법입니다. 스크롤 할 때마다, 당신이 스 와이프 할 때마다,'onDraw'는 여러 번 호출됩니다. fling을 사용하여 핀치/확대/축소 이미지 컨트롤을 작성했습니다. 즉, 플롯 애니메이션이 업데이트 될 때마다 호출되는 'computeScroll'에 뷰 매트릭스가 설정됩니다. 기본'ImageView'에서, 행렬은'canvas.concat (mDrawMatrix)'를 사용하여 캔버스에'onDraw'에 적용됩니다. fling 애니메이션은 부드럽고 반응이 좋습니다. 퍼포먼스가 걱정된다면 먼저이 방법을 시도해보십시오. 나는 네가 즐겁게 놀랄 것이라 예측한다. –
매트릭스에 관한 그래픽 코드 중 일부를 살펴 보았습니다. 우선, 대부분은 JNI 기본 레이어에서 발생합니다. 모든 레이어는 C/C++로 작성됩니다. 둘째, 행렬 값 자체는 "16.16"이라는 비표준 부동 소수점 형식을 사용하여 저장되며 신속한 산술 계산에 최적화되어 있습니다. Google은 그래픽 작업을 최적화하는 데 엄청난 노력을 기울였습니다. 뷰 변환을위한 행렬 사용은 문제가되지 않습니다. –