45

古いビュー アニメーション ( translate、など) は、少なくとも ICS ではscale受け入れられなくなったようです。AnimationInflaterそのコードを 4.0.4 で読みましたが、明示的に XML 要素set, objectAnimator,のみを想定していますanimator

http://developer.android.com/guide/topics/resources/animation-resource.htmlのドキュメントには引き続きビュー アニメーションが含まれていますが、廃止されたようです。それらを使用しようとすると、たとえばエラーが発生しますjava.lang.RuntimeException: Unknown animator name: translate

そのため、Android のObjectAnimator. translationXただし、古いビュー アニメーションが の形式で行っていたように、それ自体またはその親の関連付けられた寸法 (たとえば、 の幅) の小数値は受け入れません"75%p"

ObjectAnimator実行時に Fragment のサイズをプログラムで取得して手動で を構築することはできません。なぜなら、FragmentTransactionは resid で指定された宣言型アニメーションしか受け入れないためです。

私の目標は、アクティビティ全体を埋めるフラグメントを画面外に変換することです (基本的に、2 つのフラグメント間のシフト遷移を行っています)。これは既存のTranslationAnimation実装です ( slide_in_right.xml、対応するものslide_out_left.xmlは何らかの理由で で公開されていないためandroid.R.anim、コードベースでそれらを複製する必要があります):

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:duration="@android:integer/config_mediumAnimTime"/>
</set>

私の API レベルは 14 に設定されています。

ありがとう!

4

5 に答える 5

51

実際、オブジェクト アニメーターは小数値を受け入れます。しかし、objectAnimator やより一般的には値アニメーターの基本的な概念を理解していない可能性があります。値アニメーターは、プロパティに関連する値をアニメーション化します (色、画面上の位置 (X、Y)、アルファ パラメーター、または必要なものなど)。このようなプロパティを作成するには (xFraction と yFraction の場合)、このプロパティ名に関連付けられた独自のゲッターとセッターを作成する必要があります。FrameLayout を画面全体のサイズの 0% から 25% に変換したいとします。次に、FrameLayout オブジェクトをラップするカスタム ビューを構築し、getter と setter を記述する必要があります。

public class SlidingFrameLayout extends FrameLayout
{
    private static final String TAG = SlidingFrameLayout.class.getName();

    public SlidingFrameLayout(Context context) {
        super(context);
    }

    public SlidingFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public float getXFraction()
    {
        int width = getWindowManager().getDefaultDisplay().getWidth();
        return (width == 0) ? 0 : getX() / (float) width;
    }

    public void setXFraction(float xFraction) {
        int width = getWindowManager().getDefaultDisplay().getWidth();
        setX((width > 0) ? (xFraction * width) : 0);
    }
}

次に、xml の方法を使用して、プロパティ xml 属性の下に xFraction を配置するオブジェクト アニメーターを宣言し、AnimatorInflater でそれを膨らませることができます。

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator 
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="xFraction" 
android:valueType="floatType"
android:valueFrom="0"
android:valueTo="0.25" 
android:duration="500"/>

または、Javaラインコードを使用することもできます

ObjectAnimator oa = ObjectAnimator.ofFloat(menuFragmentContainer, "xFraction", 0, 0.25f);

それがあなたを助けることを願っています!

オリヴィエ

于 2012-06-13T13:24:57.363 に答える
8

やのようなビュー アニメーションを作成しようとしている人にとって重要な落とし穴があります。translatescale

プロパティ アニメーションは、「animator」という名前のディレクトリにあります。res/animator/filename.xml

ただし、ビュー アニメーションは単に「anim」 という名前のディレクトリに配置する必要があります。res/anim/filename.xml

最初にビュー アニメーションを「animator」フォルダに入れましたが、翻訳が有効な要素ではないという Android Studio の不満に戸惑いました。したがって、いいえ、ビュー アニメーションは非推奨ではありません。紛らわしい理由で、彼らは自分の場所を持っているだけです。

于 2015-10-25T16:25:09.453 に答える
4

ここに完全な実例があります(受け入れられた回答の著者によって概説されているように機能します)。

ボタンを押すと、2 つのフラグメント A と B が切り替わります (右から左へのスライド アニメーション)。フラグメントは、背景が異なる単なる愚かなテキスト (AAAAAA と BBBBB) です。

MainActivity.java

package com.example.slidetrans;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity {

    private static final String TAG = "Main";

    boolean showingA = true;
    Button button;

    A a;
    B b;

    private void incarnate(FragmentManager fm){
        int layoutId = R.id.frame;
        boolean fragmentWasNull = false;
        Fragment f = fm.findFragmentById(layoutId);
        if (f == null){
            Log.i(TAG, "fragment is null");
            if (showingA){
                f = a = new A();
            } else {
                f = b = new B();
            }
            fragmentWasNull = true;
        } else {
            Log.i(TAG, "fragment is not null");
            showingA = (f instanceof A);
            updateButtonText();
        }
        if (fragmentWasNull){
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(layoutId, showingA ? a : b,  "main").commit(); 
        }
    }
    private void updateButtonText(){
        button.setText(showingA ? "slide in B" : "slide in A");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fm = getFragmentManager();
        button = (Button)findViewById(R.id.button);
        incarnate(fm);
        OnClickListener listener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.setCustomAnimations(R.anim.in, R.anim.out);
                transaction.replace(R.id.frame, showingA ? new B() : new A()).commit();
                showingA = !showingA;
                updateButtonText();
            }
        };
        button.setOnClickListener(listener);
    }
}

LL.java

package com.example.slidetrans;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class LL extends LinearLayout {

    public LL(Context context) {
        super(context);
    }

    public LL(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public float getXFraction() {
        final int width = getWidth();
        if (width != 0) return getX() / getWidth();
        else return getX();
    }

    public void setXFraction(float xFraction) {
        final int width = getWidth();
        float newWidth = (width > 0) ? (xFraction * width) : -9999;
        setX(newWidth);
    }
}

main.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:orientation="vertical"
>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="slide in B" />

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    </FrameLayout>

</LinearLayout>

a.xml (レイアウト)

<?xml version="1.0" encoding="utf-8"?>
<com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#00FF00"
>

    <TextView
        android:id="@+id/aText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="AAAAAAAAAAAAAAAAAA"
        android:textSize="30sp"
        android:textStyle="bold"
    />

</com.example.slidetrans.LL>

b.xml (レイアウト)

<?xml version="1.0" encoding="utf-8"?>
<com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#FFFF00"
>

    <TextView
        android:id="@+id/bText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textStyle="bold"
        android:text="BBBBBBBBBB"
    />

</com.example.slidetrans.LL>

in.xml (アニメーション)

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
    android:duration="500"
    android:interpolator="@android:anim/linear_interpolator"
    android:propertyName="xFraction"
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:valueType="floatType" />

</set>

out.xml (アニメーション)

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
    android:duration="500"
    android:interpolator="@android:anim/linear_interpolator"
    android:propertyName="xFraction"
    android:valueFrom="0.0"
    android:valueTo="-1.0"
    android:valueType="floatType" />

</set>
于 2015-01-13T15:09:04.217 に答える
0

ビュー アニメーションは非推奨ではありません。Eclipse を使用している場合は、新しい Android XML ファイルを作成するときにリソース タイプとしてトゥイーン アニメーションの下にそれらを見つけることができます。

于 2012-07-12T07:28:35.723 に答える