如何在Android中使偏心旋转动画在纵向和横向上看起来相似?

时间:2012-01-31 21:32:43

标签: android animation imageview drawable image-rotation

我的屏幕上有一些图像,其中一个图像上有一个整洁的动画,看起来很棒。

肖像中令人敬畏的动画 - rotate_anim_port.png - 位于HERE

在风景中看起来并不那么棒。

横向动画 - rotate_anim_land.png - 在上面。

我正在以这种方式实现偏心旋转动画,因为我有几个具有相同尺寸的可绘制资源的图像视图在帧视图中堆叠在一起,以使它们保持在相对相同的位置,但能够扩展到任何大小frameview是。

它看起来很糟糕,因为RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue)基于其pivotValues的视图与视图内的图像大小不同。在纵向时,图像的大小与视图几乎相同,但在横向上,差异是显而易见的。

我一直在尝试并且无法从视图和其中的绘制图像中获取位置,以用于数学正确的pivotValues以传递代码。

以下是活动的代码:

package com.namespace;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;

public class AnimationDemoActivity extends Activity {

// piviotValues if the view is the exact size of the drawable.
final float pivotXType = 0.3280274656679151f;
final float pivotYValue = 0.5060137457044674f;

private Handler mHandler = new Handler();
ImageView outside, inside;
RotateAnimation anim, anim2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    outside = (ImageView) findViewById(R.id.imageView1);
    inside = (ImageView) findViewById(R.id.imageView2);

    outside.setVisibility(ImageView.INVISIBLE);
    inside.setVisibility(ImageView.INVISIBLE);

    // somewhere in here, code to recalculate pivotValues to adjust for the
    // size of the actual view the images are inside of

    anim = new RotateAnimation(0, 359, Animation.RELATIVE_TO_SELF,
            pivotXType, Animation.RELATIVE_TO_SELF, pivotYValue);
    anim.setInterpolator(new LinearInterpolator());
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(2000);

    anim2 = new RotateAnimation(0, 359, Animation.RELATIVE_TO_SELF,
            pivotXType, Animation.RELATIVE_TO_SELF, pivotYValue);
    anim2.setInterpolator(new LinearInterpolator());
    anim2.setRepeatCount(Animation.INFINITE);
    anim2.setDuration(750);

    mHandler.postDelayed(doRotation, 2500);
}

private Runnable doRotation = new Runnable() {
    public void run() {
        outside.setVisibility(ImageView.VISIBLE);
        inside.setVisibility(ImageView.VISIBLE);
        outside.startAnimation(anim);
        inside.startAnimation(anim2);
    }
};
}

这是布局:

<?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:background="#ffffff"
android:orientation="vertical"
android:padding="10sp" >

<ImageSwitcher
    android:id="@+id/imageSwitcher1"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:gravity="center" >
</ImageSwitcher>

<ImageSwitcher
    android:id="@+id/imageSwitcher2"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:gravity="center" >
</ImageSwitcher>

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:gravity="center" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/dwdg_outside_arrow" >
    </ImageView>

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/dwdg_inside_arrow" >
    </ImageView>
</FrameLayout>

</LinearLayout>

Here是可运行的apk - AnimationDemo.apk和压缩项目 - AnimationDemo.zip

这样做我疯了吗?我完全忽略了什么吗?怎么办?

1 个答案:

答案 0 :(得分:1)

我知道了。当然,这是一线修复。将属性android:adjustViewBounds="true"添加到ImageViews会使视图缩小到可绘制资源的大小,并使动画正常工作。