2

我需要对 ImageView 应用翻译动画,这个 ImageView 位于某个位置,我需要将其动画到屏幕的中心。这是我的翻译 xml 代码,但它不会将 ImageView 动画到中心。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="0%p"
        android:fromYDelta="0%p"
        android:toXDelta="50%p"
        android:toYDelta="50%p" />
</set>

这是 ImageView 所在的 XML:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/WelcomeLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/welcome_background"
android:orientation="vertical" >

<ImageView
    android:id="@+id/welcome_innovaLogo"
    android:layout_width="300dp"
    android:layout_height="150dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="1dp"
    android:layout_marginTop="5dp"
    android:contentDescription="@string/welcome_innovaLogoString"
    android:scaleType="fitXY"
    android:src="@drawable/innova_logo" >
</ImageView>

<TextView
    android:id="@+id/welcome_innovaInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/welcome_innovaLogo"
    android:layout_marginTop="20dp"
    android:layout_toRightOf="@+id/welcome_innovaLogo"
    android:text="@string/welcome_innovaInfoString"
    android:textColor="#9acd32"
    android:textStyle="bold" />

<TextView
    android:id="@+id/welcome_innovaHeader"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@+id/welcome_innovaInfo"
    android:layout_marginRight="20dp"
    android:text="@string/welcome_innovaHeaderString"
    android:textColor="#9acd32"
    android:textSize="20sp"
    android:textStyle="italic" />

<ListView
    android:id="@+id/welcome_commandsListView"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_below="@+id/welcome_innovaLogo"
    android:layout_marginTop="40dp"
    android:cacheColorHint="#00000000" />

<LinearLayout
    android:id="@+id/welcome_loadingLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="450dp"
    android:orientation="horizontal"
    android:visibility="invisible" >

    <ProgressBar
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:indeterminateDrawable="@drawable/progress_large" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:gravity="center_vertical"
        android:text="Loading Data..."
        android:textColor="@color/green_color"
        android:textSize="19sp" >
    </TextView>
</LinearLayout>

<!--
     <fragment
    android:id="@+id/welcome_facebookFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/welcome_innovaLogo"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="?android:attr/actionBarSize"
    android:layout_toRightOf="@+id/welcome_commandsListView"
    class="innovaEgypt.com.Welcome.FacebookFragment" >
</fragment>
-->

4

3 回答 3

3

看看这个问题。我给出了类似的答案,但动画不是来自 xml,而是来自代码。希望能帮助到你。


编辑:

您的问题是动画没有考虑图像尺寸。动画以您的原点坐标为中心ImageView

我仍然建议我的解决方案。

我尝试了我链接的答案中的代码并且它有效。只需复制此功能:

private void moveViewToScreenCenter( View view )
{
    RelativeLayout root = (RelativeLayout) findViewById( R.id.WelcomeLayout );
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics( dm );
    int statusBarOffset = dm.heightPixels - root.getMeasuredHeight();

    int originalPos[] = new int[2];
    view.getLocationOnScreen( originalPos );

    int xDest = dm.widthPixels/2;
    xDest -= (view.getMeasuredWidth()/2);
    int yDest = dm.heightPixels/2 - (view.getMeasuredHeight()/2) - statusBarOffset;

    TranslateAnimation anim = new TranslateAnimation( 0, xDest - originalPos[0] , 0, yDest - originalPos[1] );
    anim.setDuration(1000);
    anim.setFillAfter( true );
    view.startAnimation(anim);
}

并调用它作为参数传递您的视图:

    ImageView img1 = (ImageView) findViewById( R.id.welcome_innovaLogo );
    moveViewToScreenCenter(img1);

如果您的图像仍然消失,可能是因为它位于您的其他小部件后面,例如ListView. 如果是这种情况,请在末尾重新构建您的 xml 布局定义ImageView,就在Listview(只需剪切并粘贴ImageView)之后。

于 2012-07-13T18:36:35.260 回答
3

对于未来的更新...

应用视图属性动画来移动小部件的位置。本例中的图像视图

int layoutWidth = parentLayout.getWidth();

layoutWidth = ((int) layoutWidth / 2) - (imageView.getWidth()) ;

Log.d(TAG, " position - " + layoutWidth);

imageView.animate()
    .translationX(-layoutWidth)
    .translationY(0)
    .setDuration(500)
    .setInterpolator(new LinearInterpolator())
    .start();
于 2017-05-25T18:32:17.983 回答
1

尝试为此代码添加延迟。

new android.os.Handler().postDelayed(
                    new Runnable() {
                        public void run() {
                            moveViewToScreenCenter( view );
                        }
                    }, 
                1000);
于 2015-07-29T18:19:24.947 回答