Android 는 Rotate3d Animation 을 사용 하여 3D 회전 애니메이션 효 과 를 실현 하 는 인 스 턴 스 코드 를 사용 합 니 다.

안 드 로 이 드 의 ApiDemos 를 이용 한 Rotate3d Animation 은 그림 을 3D 로 회전 시 키 는 애니메이션 을 구현 하고 Y 축 을 중심 으로 회전 하 며 Z 축의 크기 도 조정 할 수 있다.시작 단 추 를 누 르 면 회전 을 시작 하고 종료 단 추 를 누 르 면 회전 을 멈 춥 니 다.

코드 는 다음 과 같 습 니 다:
Rotate3dAnimation.java

public class Rotate3dAnimation extends Animation { 
 private final float mFromDegrees; 
 private final float mToDegrees; 
 private final float mCenterX; 
 private final float mCenterY; 
 private final float mDepthZ; 
 private final boolean mReverse; 
 private Camera mCamera; 
 /** 
 * Creates a new 3D rotation on the Y axis. The rotation is defined by its 
 * start angle and its end angle. Both angles are in degrees. The rotation 
 * is performed around a center point on the 2D space, definied by a pair 
 * of X and Y coordinates, called centerX and centerY. When the animation 
 * starts, a translation on the Z axis (depth) is performed. The length 
 * of the translation can be specified, as well as whether the translation 
 * should be reversed in time. 
 * 
 * @param fromDegrees the start angle of the 3D rotation 
 * @param toDegrees the end angle of the 3D rotation 
 * @param centerX the X center of the 3D rotation 
 * @param centerY the Y center of the 3D rotation 
 * @param reverse true if the translation should be reversed, false otherwise 
 */ 
 public Rotate3dAnimation(float fromDegrees, float toDegrees, 
 float centerX, float centerY, float depthZ, boolean reverse) { 
 mFromDegrees = fromDegrees; 
 mToDegrees = toDegrees; 
 mCenterX = centerX; 
 mCenterY = centerY; 
 mDepthZ = depthZ; 
 mReverse = reverse; 
 } 
 @Override 
 public void initialize(int width, int height, int parentWidth, int parentHeight) { 
 super.initialize(width, height, parentWidth, parentHeight); 
 mCamera = new Camera(); 
 } 
 @Override 
 protected void applyTransformation(float interpolatedTime, Transformation t) { 
 final float fromDegrees = mFromDegrees; 
 float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); 
 final float centerX = mCenterX; 
 final float centerY = mCenterY; 
 final Camera camera = mCamera; 
 final Matrix matrix = t.getMatrix(); 
 //    camera    ,  restore() 
 camera.save(); 
 if (mReverse) { 
 camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); 
 } else { 
 camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); 
 } 
 //  Y   degrees  
 camera.rotateY(degrees); 
 // camera     ,   matrix 
 camera.getMatrix(matrix); 
 //camera       ,          
 camera.restore(); 
 matrix.preTranslate(-centerX, -centerY); 
 matrix.postTranslate(centerX, centerY); 
 } 
} 
Test3DRotateActivity.java

public class Test3DRotateActivity extends Activity { 
 /** Called when the activity is first created. */ 
 private final String TAG="Test3DRotateActivity"; 
 private ImageView image; 
 private Button start ,stop; 
 private Rotate3dAnimation rotation; 
 private StartNextRotate startNext; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 image = (ImageView) findViewById(R.id.image); 
 start=(Button) findViewById(R.id.start); 
 stop = (Button) findViewById(R.id.stop); 
 start.setOnClickListener(new OnClickListener() { 
 public void onClick(View v) { 
 // TODO Auto-generated method stub 
 //  360     
 startRotation(0,360); 
 } 
 }); 
 stop.setOnClickListener(new OnClickListener() { 
 public void onClick(View v) { 
 // TODO Auto-generated method stub 
 image.clearAnimation(); 
 } 
 }); 
 } 
 private void startRotation(float start, float end) { 
 //       
 final float centerX = image.getWidth() / 2.0f; 
 final float centerY = image.getHeight() / 2.0f; 
 Log.d(TAG, "centerX="+centerX+", centerY="+centerY); 
 // Create a new 3D rotation with the supplied parameter 
 // The animation listener is used to trigger the next animation 
 //final Rotate3dAnimation rotation =new Rotate3dAnimation(start, end, centerX, centerY, 310.0f, true); 
 //Z     0 
 rotation =new Rotate3dAnimation(start, end, centerX, centerY, 0f, true); 
 rotation.setDuration(2000); 
 rotation.setFillAfter(true); 
 //rotation.setInterpolator(new AccelerateInterpolator()); 
 //     
 rotation.setInterpolator(new LinearInterpolator()); 
 //     
 startNext = new StartNextRotate(); 
 rotation.setAnimationListener(startNext); 
 image.startAnimation(rotation); 
 } 
 private class StartNextRotate implements AnimationListener{ 
 public void onAnimationEnd(Animation animation) { 
 // TODO Auto-generated method stub 
 Log.d(TAG, "onAnimationEnd......"); 
 image.startAnimation(rotation); 
 } 
 public void onAnimationRepeat(Animation animation) { 
 // TODO Auto-generated method stub 
 } 
 public void onAnimationStart(Animation animation) { 
 // TODO Auto-generated method stub 
 } 
 } 
} 
main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:orientation="vertical" > 
 <Button 
 android:id="@+id/start" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="  " /> 
 <Button 
 android:id="@+id/stop" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="  " /> 
 <ImageView 
 android:id="@+id/image" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:src="@drawable/t1" 
 /> 
</LinearLayout> 
코드 에서 Camera 로 애니메이션 을 실현 합 니 다.Camera 는 바로 카메라 입 니 다.한 물체 가 제자리 에서 움 직 이지 않 습 니 다.우 리 는 카 메 라 를 가지 고 설정 한 각도 로 이동 한 다음 에 Camera 에서 이 애니메이션 을 완성 한 Matrix 를 꺼 낸 다음 에 우리 의 물 체 를 그립 니 다.이것 이 바로 이 3D 애니메이션 의 실제 원리 입 니 다.
구체 적 인 설명 은 코드 의 주석 부분 을 참조 하고 Rotate 3d Animation.java 의

matrix.preTranslate(-centerX, -centerY); 
matrix.postTranslate(centerX, centerY); 
회전 은(0,0)을 중심 으로 하기 때문에 인터페이스의 중심 과(0,0)을 맞 추기 위해 preTranslate(-centerX,-centerY)를 사용 해 야 합 니 다.회전 이 완 료 된 후에 post Translate(centerX,centerY)를 호출 하여 그림 을 옮 겨 야 합 니 다.이렇게 보 이 는 애니메이션 효 과 는 activity 의 인터페이스 그림 이 centerX 중심 에서 Y 축 을 돌 고 있 는 것 입 니 다.
너 는 또 위의 코드 를 바 꿀 수 있다.

matrix.preTranslate(-centerX, 0); 
matrix.postTranslate(centerX, 0); 
어떤 효과 가 있 는 지 보 자.
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기