安卓:使用ObjectAnimator翻译与景观的尺寸的分数值查看安卓:使用ObjectAnimat

2019-05-16 22:26发布

看来,老视动画( translatescale等)经不再接受AnimationInflater ,至少ICS的。 我在阅读4.0.4的代码,并明确预计只有XML元素setobjectAnimatoranimator

即使在文档http://developer.android.com/guide/topics/resources/animation-resource.html继续包括视图动画,他们似乎已过时。 尝试使用它们导致,例如,错误java.lang.RuntimeException: Unknown animator name: translate

因此,有必要使用Android的ObjectAnimator 。 然而,它不接受的本身或它的父(宽度对于相关联的尺寸的分数值translationX ,例如)作为旧视图的动画的形式做"75%p"

构建ObjectAnimator在运行时手动地,通过以编程撷取片段的大小,是不可行的,因为FragmentTransaction只接受由指定渣油声明性动画。

我的目标是把屏幕外被填满整个活动(我基本上做两个片段之间的变速转移)片段。 这是现有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。

谢谢!

Answer 1:

其实反对动画接受的分数值。 但也许你不明白的objectAnimator的基本概念,或者更一般的值动画。 值动画将动画相关的属性值(如颜色,屏幕上的(X,Y)的位置,α参数或任何你想要的)。 要创建这样一个属性(在你的情况xFraction和yFraction),你需要建立自己的getter和与该属性名setter方法。 比方说,你想一个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的方式来声明对象动画将xFraction属性的XML属性下,并用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);

希望它可以帮助你!

奥利维尔



Answer 2:

Android的SDK实现FragmentTransaction期待的Animator ,同时,对于一些模糊的原因,支持库实现需要的Animation ,如果你使用的片段实施从支持库的翻译动画将工作



Answer 3:

这里是为那些谁正在试图创建视图动画一样重要疑难杂症 translatescale

物业动画都位于一个名为“ 动画师 ”目录: res/animator/filename.xml

但鉴于动画必须放在一个简称为“ 动画 ”目录: res/anim/filename.xml

我第一次把我的观点动画在“动画”文件夹,被搞糊涂了关于Android工作室抱怨如何转化是不是一个有效的元素。 所以,NO,鉴于动画不会被弃用。 他们只是有一些容易混淆的原因,自己的位置。



Answer 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>


Answer 5:

查看动画不会被弃用。 如果您使用的是Eclipse,你可以创建一个新的Android XML文件时,在补间动画作为一个资源型找到它们。



文章来源: Android: Using ObjectAnimator to translate a View with fractional values of the View's dimension