Android 아 날로 그 스위치 단 추 를 누 르 면 애니메이션 열기(속성 애니메이션 의 이동 애니메이션)
본 고 는 속성 애니메이션 을 사용 하여 완성 되 었 습 니 다.속성 애니메이션 이 라면 JakeWharton 대신 이 쓴 Nine Old Androids 애니메이션 라 이브 러 리 를 언급 해 야 합 니 다.만약 에 app 이 android 3.0 이하 에서 속성 애니메이션 을 사용 해 야 한다 면 이 라 이브 러 리 는 매우 효과 적 입 니 다.만약 에 높 은 버 전에 서 만 사용 하면 시스템 에서 제공 하 는 애니메이션 API 를 직접 사용 하면 됩 니 다.
먼저 본 고 에서 실현 하고 자 하 는 애니메이션 효 과 를 살 펴 보 자.손가락 을 위로 스위치 버튼 으로 이동 한 다음 에 동작 을 클릭 하고 스위치 를 닫 을 때 부터 애니메이션 을 열 때 까지 실행 하 는 동시에 손가락 을 아래로 이동 하여 원래 의 위치 로 돌아간다.
그림 을 클릭 하여 해당 링크 로 이동 하여 애니메이션 보기
애니메이션 사용 장면
사용자 로 하여 금 특정한 기능 의 스위치 단 추 를 열 게 하거나 시스템 의 특정한 설정 을 열 게 할 때 애니메이션 을 추가 하면 사용자 의 조회 수 를 높 일 수 있 고 표현 하 는 의미 도 더욱 명확 하 다.
실현 되 기 전에 먼저 다음 과 같은 준 비 를 잘 해 야 한다.
1.나 인 올 드 안 드 로 이 드-2.4.0.jar 의 라 이브 러 리 를 다운로드 하여 안 드 로 이 드 studio 프로젝트 디 렉 터 리 의 libs 폴 더 에 넣 습 니 다.
2.build.gradle 파일 에 도입
dependencies {
compile files('libs/nineoldandroids-2.4.0.jar')
}
3.관련 이미지 자원 준비다음 에 사용자 정의 컨트롤 을 패키지 하여 전체 애니메이션 을 실현 합 니 다.
첫 번 째 단계:레이아웃 파일 finger 정의switch_on_guide_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/switch_anim_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="42dp"
android:layout_height="25dp"
android:background="@drawable/switch_container" />
<ImageView
android:id="@+id/switch_anim_circle_point"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="2.5dp"
android:layout_marginTop="2.5dp"
android:background="@drawable/switch_off_circle_point" />
</FrameLayout>
<ImageView
android:id="@+id/finger_switch"
android:layout_width="34dp"
android:layout_height="41dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="25dp"
android:background="@drawable/finger_normal" />
</merge>
레이아웃 파일 의 프 리 케이블 길 이 는 다음 과 같 습 니 다:두 번 째 단계:사용자 정의 컨트롤(SwitchOnAnimView)을 정의 하여 전체 애니메이션 을 실현 합 니 다.
package com.androidanimation.animationview;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.androidanimation.R;
import com.androidanimation.animations.BaseAnimatorListener;
import com.androidanimation.utils.ViewUtil;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.view.ViewHelper;
/**
* Created by popfisher on 2016/9/3.
*/
public class SwitchOnAnimView extends FrameLayout {
private Handler mHandler = new Handler();
/** View */
private ImageView mCirclePtImgv;
/** View */
private ImageView mFingerImgv;
/** */
private float mFingerMoveDistance;
/** View */
private float mCirclePtMoveDistance;
private static final int FINGER_ANIM_DURATION = 300;
private static final int CIRCLE_PT_ANIM_DURATION = 500;
private boolean isStopAnim = false;
public SwitchOnAnimView(Context context) {
this(context, null);
}
public SwitchOnAnimView(Context context, AttributeSet attrs) {
super(context, attrs);
//
LayoutInflater.from(context).inflate(R.layout.finger_switch_on_guide_layout, this, true);
initView();
}
private void initView() {
mCirclePtImgv = (ImageView) findViewById(R.id.switch_anim_circle_point);
mFingerImgv = (ImageView) findViewById(R.id.finger_switch);
// UI
mFingerMoveDistance = ViewUtil.dp2px(getContext(), 20f);
mCirclePtMoveDistance = ViewUtil.dp2px(getContext(), 17.5f);
}
/**
*
*/
public void startAnim() {
isStopAnim = false;
//
ViewHelper.setTranslationX(mCirclePtImgv, 0);
mCirclePtImgv.setBackgroundResource(R.drawable.switch_off_circle_point);
mFingerImgv.setBackgroundResource(R.drawable.finger_normal);
startFingerUpAnim();
}
/**
*
*/
public void stopAnim() {
isStopAnim = true;
}
/**
* View
*/
private void startCirclePointAnim() {
if (mCirclePtImgv == null) {
return;
}
ObjectAnimator circlePtAnim = ObjectAnimator.ofFloat(mCirclePtImgv, "translationX", 0, mCirclePtMoveDistance);
circlePtAnim.setDuration(CIRCLE_PT_ANIM_DURATION);
circlePtAnim.start();
}
/**
*
*/
private void startFingerUpAnim() {
ObjectAnimator fingerUpAnim = ObjectAnimator.ofFloat(mFingerImgv, "translationY", 0, -mFingerMoveDistance);
fingerUpAnim.setDuration(FINGER_ANIM_DURATION);
fingerUpAnim.addListener(new BaseAnimatorListener() {
@Override
public void onAnimationEnd(Animator animator) {
if (mFingerImgv == null || mHandler == null) {
return;
}
// View
mFingerImgv.setBackgroundResource(R.drawable.finger_click);
// , 200
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mCirclePtImgv == null || mHandler == null) {
return;
}
// View
mCirclePtImgv.setBackgroundResource(R.drawable.switch_on_circle_point);
startCirclePointAnim();
// 100
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//
if (mFingerImgv != null) {
mFingerImgv.setBackgroundResource(R.drawable.finger_normal);
}
startFingerDownAnim();
}
}, 100);
}
}, 200);
}
});
fingerUpAnim.start();
}
/**
*
*/
private void startFingerDownAnim() {
if (mFingerImgv == null) {
return;
}
ObjectAnimator fingerDownAnim = ObjectAnimator.ofFloat(mFingerImgv, "translationY", -mFingerMoveDistance, 0);
fingerDownAnim.setDuration(FINGER_ANIM_DURATION);
fingerDownAnim.addListener(new BaseAnimatorListener() {
@Override
public void onAnimationEnd(Animator animator) {
// , , , , 1
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (isStopAnim) {
return;
}
startAnim();
}
}, 1000);
}
});
fingerDownAnim.start();
}
}
마지막 단계:SwitchOnAnimView 를 추가 하고 startAnim 방법 으로 애니메이션 을 실행 하 는 캐리어 를 찾 습 니 다.여기 서 Activity 에서 이 애니메이션 을 재생 합 니 다.activity 레이아웃 파일 activity 정의finger_switchon_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_animation_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<com.androidanimation.animationview.SwitchOnAnimView
android:id="@+id/switch_on_anim_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Activity:FingerSwitchOnAnimActivity 정의 및 구현
package com.androidanimation;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import com.androidanimation.animationview.SwitchOnAnimView;
public class FingerSwitchOnAnimActivity extends Activity {
private Handler mHandler = new Handler();
private SwitchOnAnimView mSwitchOnAnimView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_finger_switchon_anim);
mSwitchOnAnimView = (SwitchOnAnimView) findViewById(R.id.switch_on_anim_view);
}
@Override
protected void onResume() {
super.onResume();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mSwitchOnAnimView.startAnim();
}
}, 500);
}
@Override
protected void onPause() {
super.onPause();
mSwitchOnAnimView.stopAnim();
}
}
애니메이션 구현 요약:Android 의 애니메이션 을 파악 하 는 것 은 어렵 지 않 습 니 다.어 려 울 때 복잡 한 애니메이션 을 어떻게 실현 하 는 지 복잡 한 애니메이션 을 실현 하 는 몇 가지 절 차 를 정리 하 겠 습 니 다.
1.애니메이션 분해:모든 복잡 한 애니메이션 은 여러 원자 애니메이션 의 조합 으로 분해 할 수 있다.
2.애니메이션 연결 시기 분석:복잡 한 애니메이션 이 여러 개의 원자 애니메이션 으로 분 해 된 후에 다시 연결 해 야 한다.
여기 가 바로 각 원자 애니메이션 의 집행 시기 이 고 누가 먼저 하고 누가 나중에 동시에 집행 하 는 지 하 는 것 이다.
3.원자 애니메이션 구현:해 체 된 원자 애니메이션 을 순서대로 구현
4.애니메이션 조립:위 에 준 비 된 후에 원자 애니메이션 을 일정한 규칙 에 따라 조립 하고 연결 시 키 면 전체 복잡 한 애니메이션 이 작 동 합 니 다.
원자 애니메이션:본 고 는 더 이상 분할 할 수 없 는 애니메이션 을 말한다.
본 논문 의 애니메이션 을 보면 애니메이션 은 네 가지 로 나 눌 수 있다.
a.손가락 위로 이동 애니메이션
b.손가락 클릭 조작(여 기 는 애니메이션 이 아니 라 간단 한 애니메이션 으로 도 사용 할 수 있 습 니 다)
c.스위치 단추 원점 에서 오른쪽으로 이동 애니메이션
d.손가락 아래로 이동 애니메이션.
본 애니메이션 의 실행 시 기 는 다음 과 같다.
a 먼저 실행,a 실행 완료 후 즉시 b 실행,b 실행 완료 후 200 ms 실행 c(클릭 효과 구현)
c 실행 시작 100 ms 후 실행 d
애니메이션 의 해체 와 애니메이션 의 연결 시기 분석 은 쉽 지 않다.육안 으로 는 관찰 할 수 없 기 때문에 애니메이션 을 재생 할 때 천천히 보아 야 한다.만약 에 티 가 나 지 않 는 다 면 회사 의 UI 동 료 를 찾 아 분석 에 협조 하 는 것 이 좋다.우 리 는 애니메이션 을 간단하게 구분 하고 애니메이션 을 확대 하 는 것 이 간단 하지만 사인 알고리즘 애니메이션 이나 다른 알고리즘 이 제어 하 는 애니메이션 을 구분 할 수 없습니다.본 논문 에서 애니메이션 은 상대 적 으로 간단 하고 실현 하기 도 쉽 지만 사상 은 똑 같 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.