모션 트윈 및 속성 모션 메모리 유출 분석
2269 단어 안드로이드 기술
public static AnimationHandler getInstance() {
if (sAnimatorHandler.get() == null) {
sAnimatorHandler.set(new AnimationHandler());
}
return sAnimatorHandler.get();
}
그러니까 하나의 속성 애니메이션을 켜면 하나의Handler가 더 많은 것은 아니다.AnimationFrameCallback 객체가 하나 더 있을 뿐입니다.하나의 속성 애니메이션이 하나의 라인을 열었다는 말도 자연히 옳지 않다.
그럼 뷰에 붙은 트윈 애니메이션이 메모리 유출을 일으키지 않을까요?우리는 간단하게 원본 코드를 통해 해석해 봅시다.Animation의 startNow 방법을 보도록 하겠습니다.
public void startNow() {
setStartTime(AnimationUtils.currentAnimationTimeMillis());
}
public void setStartTime(long startTimeMillis) {
mStartTime = startTimeMillis;
mStarted = mEnded = false;
mCycleFlip = false;
mRepeated = 0;
mMore = true;
}
뷰의 startAnimation을 보는 방법
public void startAnimation(Animation animation) {
animation.setStartTime(Animation.START_ON_FIRST_FRAME);
setAnimation(animation);
invalidateParentCaches();
invalidate(true);
}
항상 Handler를 켜지 않거나 Callback에 등록하지 않고 애니메이션의 시작 시간을 기록하고 로고 위치 알림 페이지를 초기화하는 등만 기록합니다.따라서 트윈 애니메이션은view의 회수에 따라 회수되며 메모리 유출 위험이 없습니다.구체적인 트윈 애니메이션의 실현 원리는 여러분들이 계속 탐색할 수 있습니다.
여기에 일부 트윈 애니메이션을 추가합니다: 1 사실 애니메이션은view의parentView에서 발생하고view의 canvas를 수정하여 애니메이션 효과를 실현하기 때문에view의 실제 크기는 변하지 않았습니다.2 모션 트윈은 handler에 의존하지 않으며 콜백이 없으며 MQ와 관련이 없습니다.그래서 메모리 유출 가능성은 없어요.3 모션 트윈은view detach에 null로 설정되기 때문에view detach 이후 모션 트윈의 효과가 없습니다.이 비어 있는 동작은detach 방법에서 발생합니다. 만약view가detach라면.모션 트윈을 표시할 수 있도록 애니메이션을 설정하고 화면에 표시합니다.4RecyclerView는 다중 캐시입니다. 1급 캐시에서view가 화면을 떠나서 돌아오면 onbind 방법을 사용하지 않습니다. 따라서 onbind에 모션 트윈을 설정하면, 모션이 RecycleView 위아래로 움직일 수 있습니다.해결 방법은view의attach방법에서 애니메이션의 논리를 설정할 수 있습니다.5 모션 트윈이 속성 애니메이션보다 효율적입니다.
어디에서 나를 찾을 수 있습니까?
내 Github:https://github.com/AndroidMsky
내 블로그 홈 페이지:http://blog.csdn.net/androidmsky
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView가 입력박스를 눌렀을 때 핸드폰 소프트 키보드에 문제가 없었다WebView에 입력란이 있을 때 누르면 핸드폰 소프트 키보드가 호출되지 않습니다.웹뷰에 초점을 맞추면 된다고 인터넷에서 검색해 보세요.방법이 호출되었습니다. 코드는 다음과 같습니다: 웹 뷰.requestFocus(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.