有没有办法在android中为Object with ObjectAnimator创建倾斜动画

时间:2014-06-27 07:53:43

标签: android animation android-view skew objectanimator

我想为android中的View创建倾斜动画。 所以,我有矩形视图(这是正常/开始状态),最后它应该是这样的:
enter image description here

我可以使用android.view.animation使用TYPE_MATRIX Matrix包来做这样的事情。因此,我可以创建preSkew并使用Matrix方法,将此ObjectAnimator应用于我的自定义动画,然后在视图上启动此动画。所以这没关系。

但是

问题是我想用android.view.animation执行此操作。 因为不建议使用ObjectAnimator包。 但我无法通过ImageView类获得此问题的解决方案。

如果我有setImageMatrix,我可以将方法ObjectAnimator用于MatrixEvaluator(并创建自定义View来评估每个因素的相应矩阵), 但是我希望用TextView类来解决这个问题,而不是它的某些子类。 主要原因是,例如,setMatrix没有像TextView那样的公共方法,我也希望得到SkewTextView的解决方案。因此,获得基本View类的解决方案是主要的愿望。

还有另一种解决方案:创建自定义,例如onDraw,其中canvas.skew方法使用android.view.animation方法。

但是这甚至比使用View包更糟糕的解决方案,因为你需要为你想要倾斜的任何View子类创建包装器。

所以,我不知道,我如何能ObjectAnimator View setSkew,因为setMatrix类没有公共方法,如ObjectAnimator或{{ 1}})。

您如何解决这个问题?
你知道如何解决这个问题吗? {{1}}是否有解决此问题的方法?

非常感谢任何帮助(甚至是想法) 感谢

2 个答案:

答案 0 :(得分:2)

没有子类化,这可能有点棘手。我的主要想法是使用TimeAnimator,它将与Camera(可以使用Matrix转换)一起为您提供时间回调。或者,您可以使用TimeAnimator从您想要倾斜的视图制作位图,使原始视图不可见,并在每个TimeAnimator步骤上应用矩阵绘制位图。但我不确定这是否是最佳方法,因为您必须在每个帧上创建一个新的位图

编辑:不,相机方法不是这样做的方式,如下面的评论中所述

答案 1 :(得分:0)

Skew Animation

我在项目中使用 Android Property Animation API创建了偏斜动画 GitHub Link )。

我做了什么:

  • 创建了自定义视图(SkewView)并为其添加了SKEW_X属性。
public class SkewView extends ImageView {
    private static final String TAG = "SkewView";

    public static final Property SKEW_X 
                = new FloatProperty("skewX") {
                    @Override
                    public void setValue(SkewView object, float value) {
                        object.setSkewX(value);
                    }

                    @Override
                    public Float get(SkewView object) {
                        return object.getSkewX();
                    }
                };

    private float mSkewX;

    // ...

    public float getSkewX() {
        return mSkewX;
    }

    public void setSkewX(float skewX) {
        mSkewX = skewX;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mSkewX != 0) {
            canvas.skew((float) (mSkewX * Math.PI / 180.0f), 0);
        }
        super.onDraw(canvas);
    }
}
  • 使用ObjectAnimator为此媒体资源制作动画。
ObjectAnimator skewAnimator = ObjectAnimator.ofFloat(mTarget, SkewView.SKEW_X, 30);