Android 사용자 정의 애니메이션 보기 흔 들 림 효과 구현

사용자 정의 Animation 을 사용 하여 View 의 좌우 흔 들 림 효 과 를 실현 합 니 다.그림 참조:

코드 는 매우 간단 해서 직접 소스 코드 에 들어간다.
activity_maini.xml 레이아웃 파일:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ffffff"
 android:gravity="center"
 android:orientation="vertical">

 <!--  -->
 <ImageView
  android:id="@+id/iv_dial"
  android:layout_width="200dp"
  android:layout_height="200dp"
  android:src="@drawable/img"/>

 <!--    -->
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="bottom"
  android:gravity="center"
  android:orientation="horizontal">

  <Button
   android:id="@+id/btn_start"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="  "/>

  <Button
   android:id="@+id/btn_end"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="  "/>

 </LinearLayout>

</LinearLayout>
ImageView 를 다른 View 컨트롤 로 대체 할 수도 있 고 흔 들 림 효 과 를 실현 할 수 있 습 니 다.
메 인 인터페이스 MainActivity

/**
 *    
 * Created by zhuwentao on 2016-08-08.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

 /**      */
 private ImageView mDialIv;

 /**      */
 private Button mStartBtn;

 /**      */
 private Button mEndBtn;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initUI();
  initListener();
 }

 /**
  *    UI
  */
 private void initUI() {
  mDialIv = (ImageView) findViewById(R.id.iv_dial);
  mStartBtn = (Button) findViewById(R.id.btn_start);
  mEndBtn = (Button) findViewById(R.id.btn_end);
 }

 /**
  *      
  */
 private void initListener() {
  mStartBtn.setOnClickListener(this);
  mEndBtn.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.btn_start:
    showAnimation();
    break;
   case R.id.btn_end:
    mDialIv.clearAnimation();
    break;
  }
 }

 /**
  *     
  */
 private void showAnimation() {
  //          
  CustomRotateAnim rotateAnim = CustomRotateAnim.getCustomRotateAnim();
  //       1 
  rotateAnim.setDuration(1000);
  //        
  rotateAnim.setRepeatCount(-1);
  //      
  rotateAnim.setInterpolator(new LinearInterpolator());
  //       
  mDialIv.startAnimation(rotateAnim);
 }
}
setRepeatCount()는 애니메이션 을 반복 재생 하 는 횟수 를 설정 합 니 다.-1 은 반복 재생 을 위해 서 입 니 다.setRepeatCount(0)는 한 번 실행 하 는 것 을 의미 하고 setRepeatCount(1)는 한 번 반복 하 는 것 을 의미 합 니 다.즉,애니메이션 이 두 번 실 행 됩 니 다.
setInterpolator()방법 은 플러그 인 을 설정 하여 애니메이션 의 효 과 를 지정 하 는 것 입 니 다.시스템 이 제공 하 는 Linear Interpolator()의 등 속 변화 효 과 를 사용 합 니 다.
사용자 정의 Custom RotateAnim 애니메이션 은 Animation 을 계승 해 야 합 니 다.initialize()와 apply Transformation()방법 만 실현 하면 됩 니 다.

/**
 *       
 * Created by zhuwentao on 2016-08-08.
 */
public class CustomRotateAnim extends Animation {

 /**     */
 private int mWidth;

 /**     */
 private int mHeight;

 /**    */
 private static CustomRotateAnim rotateAnim;

 /**
  *       
  * @return   
  */
 public static CustomRotateAnim getCustomRotateAnim() {
  if (null == rotateAnim) {
   rotateAnim = new CustomRotateAnim();
  }
  return rotateAnim;
 }

 @Override
 public void initialize(int width, int height, int parentWidth, int parentHeight) {
  this.mWidth = width;
  this.mHeight = height;
  super.initialize(width, height, parentWidth, parentHeight);
 }

 @Override
 protected void applyTransformation(float interpolatedTime, Transformation t) {
  //     
  t.getMatrix().setRotate((float)(Math.sin(interpolatedTime*Math.PI*2)*50), mWidth/2, mHeight/2);
  super.applyTransformation(interpolatedTime, t);
 }
}
initialize(int width,int height,int parentWidth,int parentHeight)에서 width 와 height 는 애니메이션 을 재생 할 수 있 는 View 공간 이 넓 고 parentWidth 와 parentHeight 는 이 View 컨트롤 이 있 는 부모 컨트롤 의 너비 가 높다 는 것 을 의미 합 니 다.
현재 View 의 너비 와 높이 를 사용 하여 흔 들 리 는 회전 점 을 확인 해 야 하기 때문에 initialize 에서 View 컨트롤 의 너비 와 높이 를 가 져 옵 니 다.
apply Transformation()방법 은 애니메이션 의 구체 적 인 실현 방법 입 니 다.시스템 에서 애니메이션 을 그 릴 때 이 방법 을 반복 적 으로 호출 합 니 다.apply Transformation()방법 을 호출 할 때마다 그 중의 interpolated Time 매개 변 수 는 한 번 바 뀌 고 값 은 0 에서 1 로 증가 하 며 interpolated Time 의 값 이 1 일 때 애니메이션 이 끝 납 니 다.
Transformatio 류 는 변 환 된 행렬 로 이 행렬 을 바 꾸 면 각종 복잡 한 효 과 를 실현 할 수 있다.
이 방법 을 복사 하면 안에서 사용자 정의 애니메이션 효 과 를 실현 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기