Android 애니메이션 효과 사용자 정의 ViewGroup 레이아웃 애니메이션 추가(5)
10456 단어 AndroidViewGroup레이아웃 애니메이션
앞의 몇 편의 글 에서 보 간 애니메이션,프레임 애니메이션,속성 애니메이션 을 소 개 했 는데 대부분이 View 를 대상 으로 하 는 애니메이션 입 니 다.그러면 어떻게 ViewGroup 에 애니메이션 을 추가 해 야 합 니까?오늘 은 사용자 정의 View Group 과 결합 하여 레이아웃 애니메이션 을 배 웁 니 다.본 고 는 사용자 정의 그림 선택 컨트롤 설정 애니메이션 을 예 로 들 어 레이아웃 애니메이션 을 배 울 것 입 니 다.
여러 줄 의 그림 을 표시 할 ViewGroup 사용자 정의:
사용자 정의 컨트롤 에 대한 설명 을 하지 않 습 니 다.알 고 싶 은 것 은 다음 과 같은 몇 편의 글 을 볼 수 있 습 니 다.
•Android 사용자 정의 컨트롤 의 기본 원리(1)
•Android 사용자 정의 컨트롤 의 사용자 정의 속성(2)
•Android 사용자 정의 컨트롤 의 사용자 정의 조합 컨트롤(3)
•Android 사용자 정의 컨트롤 의 사용자 정의 ViewGroup 탭 클 라 우 드 구현(4)
몇 개의 속성 값 을 설명 합 니 다:
<declare-styleable name="GridImageViewGroup">
<attr name="childVerticalSpace" format="dimension"/>
<attr name="childHorizontalSpace" format="dimension"/>
<attr name="columnNum" format="integer"/>
</declare-styleable>
GridImageViewGroup.java 코드
public class GridImageViewGroup extends ViewGroup {
private int childVerticalSpace = 0;
private int childHorizontalSpace = 0;
private int columnNum = 3;
private int childWidth = 0;
private int childHeight = 0;
public GridImageViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.GridImageViewGroup);
if (attributes != null) {
childVerticalSpace = attributes.getDimensionPixelSize(R.styleable.GridImageViewGroup_childVerticalSpace, 0);
childHorizontalSpace = attributes.getDimensionPixelSize(R.styleable.GridImageViewGroup_childHorizontalSpace, 0);
columnNum = attributes.getInt(R.styleable.GridImageViewGroup_columnNum, 3);
attributes.recycle();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int rw = MeasureSpec.getSize(widthMeasureSpec);
int rh = MeasureSpec.getSize(heightMeasureSpec);
int childCount = getChildCount();
if (childCount > 0) {
childWidth = (rw - (columnNum - 1) * childHorizontalSpace) / columnNum;
childHeight = childWidth;
int vw = rw;
if (childCount < columnNum) {
vw = childCount * (childHeight + childVerticalSpace);
}
int rowCount = childCount / columnNum + (childCount % columnNum != 0 ? 1 : 0);
int vh = rowCount * childHeight + (rowCount > 0 ? rowCount - 1 : 0) * childVerticalSpace;
setMeasuredDimension(vw, vh);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int left = 0;
int top = 0;
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
left = (i % columnNum) * (childWidth + childHorizontalSpace);
top = (i / columnNum) * (childHeight + childVerticalSpace);
child.layout(left, top, left + childWidth, top + childHeight);
}
}
xml 에서 참조:
<com.whoislcj.animation.GridImageViewGroup
android:id="@+id/image_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:animateLayoutChanges="true"
lee:childHorizontalSpace="10dp"
lee:childVerticalSpace="10dp"
lee:columnNum="3"/>
Activity 에서 호출:
private void initViews() {
mImageViewGroup = (GridImageViewGroup) findViewById(R.id.image_layout);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.mipmap.add_image);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addImageView();
}
});
mImageViewGroup.addView(imageView);
}
public void addImageView() {
final ImageView imageView = new ImageView(MainActivity4.this);
imageView.setImageResource(R.mipmap.lottery);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImageViewGroup.removeView(imageView);
}
});
mImageViewGroup.addView(imageView, 0);
}
실현 효 과 는 다음 과 같다. 레이아웃 애니메이션 배경:
모든 일 은 레이아웃 애니메이션 을 왜 도입 해 야 하 는 지 분명하게 물 어 봐 야 한다.사실 위의 실현 효 과 를 통 해 알 수 있 듯 이 그림 을 추가 하고 삭제 할 때 모두 갑 작 스 러 워 보이 고 어떤 말로 표현 해 야 할 지 모 르 겠 지만 어쨌든 불편 하 다.사실 저 는 평소에 View.setVisibility()방법 을 개발 할 때 이런 느낌 을 받 았 습 니 다.이것 도 레이아웃 애니메이션 이 만 든 배경 이 죠.
레이아웃 애니메이션:
레이아웃 애니메이션 은 ViewGroup 이 레이아웃 할 때 발생 하 는 애니메이션 효 과 를 말 합 니 다.레이아웃 애니메이션 을 실현 하 는 데 는 다음 과 같은 몇 가지 방식 이 있 습 니 다.
첫 번 째 방식:xml 에서 ViewGrope 에 android:animateLayoutChanges="true"속성 을 설정 합 니 다.
<com.whoislcj.animation.GridImageViewGroup
android:id="@+id/image_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:animateLayoutChanges="true"
lee:childHorizontalSpace="10dp"
lee:childVerticalSpace="10dp"
lee:columnNum="3"/>
이렇게 간단 한 한 마디 로 이 루어 지 는 효 과 를 실현 할 수 있 습 니 다.효과 가 어떤 지 보 세 요.이런 방식 은 간단 하지만 실 현 된 레이아웃 애니메이션 은 비교적 단일 하 다.다음은 두 번 째 방식 을 본다.
두 번 째 방식:LayoutTransition 실현
LayoutTransition mLayoutTransition = new LayoutTransition();
//
mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, 50);
mLayoutTransition.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 50);
mLayoutTransition.setStagger(LayoutTransition.APPEARING, 50);
mLayoutTransition.setStagger(LayoutTransition.DISAPPEARING, 50);
PropertyValuesHolder appearingScaleX = PropertyValuesHolder.ofFloat("scaleX", 0.5f, 1.0f);
PropertyValuesHolder appearingScaleY = PropertyValuesHolder.ofFloat("scaleY", 0.5f, 1.0f);
PropertyValuesHolder appearingAlpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);
ObjectAnimator mAnimatorAppearing = ObjectAnimator.ofPropertyValuesHolder(this, appearingAlpha, appearingScaleX, appearingScaleY);
// LayoutTransition
mLayoutTransition.setAnimator(LayoutTransition.APPEARING, mAnimatorAppearing);
PropertyValuesHolder disappearingAlpha = PropertyValuesHolder.ofFloat("alpha", 1f, 0f);
PropertyValuesHolder disappearingRotationY = PropertyValuesHolder.ofFloat("rotationY", 0.0f, 90.0f);
ObjectAnimator mAnimatorDisappearing = ObjectAnimator.ofPropertyValuesHolder(this, disappearingAlpha, disappearingRotationY);
// LayoutTransition
mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, mAnimatorDisappearing);
ObjectAnimator mAnimatorChangeDisappearing = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f);
// LayoutTransition
mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, mAnimatorChangeDisappearing);
ObjectAnimator mAnimatorChangeAppearing = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f);
// LayoutTransition
mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, mAnimatorChangeAppearing);
// mImageViewGroup mLayoutTransition
mImageViewGroup.setLayoutTransition(mLayoutTransition);
위 에서 사용자 정의 LayoutTransition 을 통 해 시스템 이 향상 시 킨 기본 애니메이션 효 과 를 수정 합 니 다.사용자 정의 애니메이션 효과 가 필요 하지 않 으 면 mLayoutTransition.setAnimator(LayoutTransition.DISAPEARING,mAnimator Disappearing)를 호출 하지 않 습 니 다.됐어. LayoutTransition 은 다음 과 같은 몇 가지 과도 유형 을 제공 합 니 다.
•APPEARING-요소 가 용기 에 나타 날 때 애니메이션 디 스 플레이 가 필요 합 니 다.
•CHANGE_APPEARING-용기 에 새로운 요소 가 나타 나 려 면 다른 요소 의 변 화 는 애니메이션 으로 표시 해 야 합 니 다.
•DISAPPEARING-요소 가 용기 에서 사라 질 때 애니메이션 디 스 플레이 가 필요 합 니 다.
•CHANGE_DISAPPEARING-용기 에 있 는 요소 가 사라 지기 때문에 다른 요소 의 변 화 는 애니메이션 으로 표시 해 야 합 니 다.
수 정 된 애니메이션 효과 보기:
세 번 째 방식:레이아웃 애니메이션 설정 을 통 해 레이아웃 애니메이션 을 실현 합 니 다.
AlphaAnimation alphaAnimation = new AlphaAnimation(0f, 1f);
alphaAnimation.setDuration(200);
LayoutAnimationController animationController = new LayoutAnimationController(alphaAnimation, 0.5f);
animationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
mImageViewGroup.setLayoutAnimation(animationController);
표시 순 서 는 다음 과 같은 몇 가지 가 있 습 니 다.• ORDER_NORMAL;//순서 표시
• ORDER_REVERSE;//역 디 스 플레이
• ORDER_RANDOM//랜 덤 디 스 플레이
xml 로 도 가능 합 니 다.
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/alpha"
/>
ViewGroup xml 에 android:layoutAnimation 속성 추가
<com.whoislcj.animation.GridImageViewGroup
android:id="@+id/image_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layoutAnimation="@anim/layoutanimation"
lee:childHorizontalSpace="10dp"
lee:childVerticalSpace="10dp"
lee:columnNum="3"/>
이런 방식 은 보충 애니메이션 을 사용 하기 때문에 개인 이 이런 방식 을 추천 하지 않 는 다.그 이 유 는 간단 한 애니메이션 효과 가 상대 적 으로 단일 하기 때문이다.요약:
이 편 은 레이아웃 애니메이션 을 배 웠 습 니 다.이로부터 안 드 로 이 드 의 애니메이션 학습 도 일 단락 될 것 입 니 다.그 다음 에 애니메이션 을 배 우 는 과정 에서 만난 프로 그래 밍 지식,예 를 들 어 체인 프로 그래 밍,TreadLocal 등 을 정리 하려 고 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.