有没有办法在android中使用ObjectAnimator为视图创建扭曲动画

有没有办法在android中使用ObjectAnimator为视图创建扭曲动画,android,animation,android-view,skew,objectanimator,Android,Animation,Android View,Skew,Objectanimator,我想为android中的视图创建扭曲动画。 所以,我有一个矩形视图(这是正常/开始状态),最后应该是这样: 我可以用android.view.animation包使用TYPE\u MATRIX来做这样的事情。因此,我可以创建Matrix并使用preSkew方法,将此Matrix应用于我的自定义动画,然后在视图上启动此动画。这没关系 但是 问题是我想用ObjectAnimator来实现这一点。 因为不建议使用android.view.animation软件包。 但是我不能用ObjectAnima

我想为android中的视图创建扭曲动画。 所以,我有一个矩形视图(这是正常/开始状态),最后应该是这样:

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

但是

问题是我想用
ObjectAnimator
来实现这一点。 因为不建议使用
android.view.animation
软件包。 但是我不能用
ObjectAnimator
类来解决这个问题

如果我有
ImageView
,我可以为
ObjectAnimator
使用方法
setImageMatrix
(还可以创建自定义
matrixeevaluator
来评估每个因子的对应矩阵), 但是我想用
视图
类来解决这个问题,而不是它的某个子类。
主要原因是,
TextView
没有像
setMatrix
这样的公共方法,我也想得到
TextView
的解决方案。因此,获得基本视图类的解决方案是主要的愿望

还有另一种解决方案:创建自定义,例如,
SkewTextView
,其中我们使用的
onDraw
方法是
canvas.skew
方法

但这是比使用
android.view.animation
包更糟糕的解决方案,因为您需要为任何想要扭曲的
view
子类创建包装

因此,我不知道如何使用
ObjectAnimator
(因为
View
类没有像
setkew
setMatrix
这样的公共方法)扭曲
视图

您将如何解决这个问题?
你知道如何解决这个问题吗?
使用
ObjectAnimator
是否有解决此问题的方法?

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

谢谢

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

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

我在我的项目中()使用Android属性动画API创建了一个扭曲动画

我所做的:

  • 创建了自定义视图()并向其添加了
    SKEW\X
    属性。
  • 使用
    ObjectAnimator
    设置此属性的动画。

事实上,为什么你认为不建议使用动画来实现这一点?当您需要更新视图的位置(或其属性)时,动画师会更好,但如果您只需要进行一些可见但不可触摸的更改,为什么不使用动画?谢谢您的评论。好的,android.view.animation软件包中的动画现在还没有被弃用,我可以使用它们,但它们似乎以后会被弃用(这是我的观点)。因此,我尽量避免使用android.view.animation包中的动画。所以,我的问题是关于研究的:如果android.view.animation中的动画不受欢迎,我该怎么办。这有一些问题:1)相机没有提供扭曲变换矩阵的方法,也没有设置已经扭曲的矩阵实例的方法2)即使提供了这些方法,除了在onDraw方法中应用于canvas实例之外,将无法将此摄影机应用于视图,但如果我在那里授予访问权限,我可以在画布上直接调用postSkew()等方法,而无需摄影机。并且更改onDraw()方法并不是从外部扭曲视图的方法。但无论如何,谢谢你的想法)是的,对不起,我的错。摄影机方法肯定不会起作用,第二种方法可能也会有一些问题,但至少我很确定它会起作用,不过我并不认为动画类会被弃用
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 skewAnimator = ObjectAnimator.ofFloat(mTarget, SkewView.SKEW_X, 30);