2

我想为 android 中的视图创建倾斜动画。所以,我有矩形视图(这是正常/开始状态),最后它应该是这样的:
在此处输入图像描述

我可以android.view.animation使用. _ TYPE_MATRIX所以我可以创建Matrix和使用preSkew方法,将它应用Matrix到我的自定义动画,然后在视图上启动这个动画。所以这没关系。

问题是我想用ObjectAnimator. 因为使用android.view.animation包不推荐使用。但是我无法通过ObjectAnimator课堂解决这个问题。

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

还有另一种解决方法:创建自定义,例如,SkewTextView在哪个onDraw方法中我们使用canvas.skewmethod.

但这甚至比使用android.view.animation包更糟糕,因为您需要为View要倾斜的任何子类创建包装器。

所以,我不知道,我怎么能用Viewa倾斜ObjectAnimator(因为View类没有像setSkewor这样的公共方法setMatrix)。

你将如何解决这个问题?
你知道如何解决这个问题吗?
这个问题有解决方案ObjectAnimator吗?

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

4

2 回答 2

2

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

编辑:不,相机方法不是这样做的方法,因为它在下面的评论中说明

于 2014-10-16T14:28:06.247 回答
1

倾斜动画

我在我的项目( GitHub 链接)中使用Android 属性动画API创建了一个倾斜动画。

我做了什么:

  • 创建了一个自定义视图 ( 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);
于 2018-02-21T11:28:27.480 回答