анимация масштабирования на холсте DragShadowBuilder во время перетаскивания

Как я могу создать собственный DragShadowBuilder для анимации масштабирования представления, которое находится на холсте, а не просто масштабирования до заданного размера?

Например, у меня есть ImageView, который используется для перетаскивания, и когда я нажимаю на ImageView, изображение должно расти на холсте, используемом для перетаскивания, которое вы увидите, следуя за своим пальцем, когда перетаскиваете его в зону перетаскивания. .

Я могу заставить изображение масштабироваться до заданного размера, используя следующий класс CustomDragShadowBuilder, найденный здесь, но есть ли способ анимировать масштабирование?

public static class CustomDragShadowBuilder extends View.DragShadowBuilder {

    private static final int SCALING_FACTOR = 4;

    public CustomDragShadowBuilder(View view) {
        super(view);
    }

    @Override
    public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
        View v = getView();
        final int width = v.getWidth() * SCALING_FACTOR;
        final int height = v.getHeight() * SCALING_FACTOR;
        shadowSize.set(width, height);
        shadowTouchPoint.set(width / 2, height / 2);
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        canvas.scale(SCALING_FACTOR, SCALING_FACTOR);
        getView().draw(canvas);
    }

}

person user1677657    schedule 08.10.2014    source источник


Ответы (1)


лучшее решение, которое я нашел, - это анимировать масштаб перед началом перетаскивания, что-то вроде этого:

    final View yourView;
    ObjectAnimator scaleX = ObjectAnimator.ofFloat(yourView, "scaleX",4f);
    ObjectAnimator scaleY = ObjectAnimator.ofFloat(yourView, "scaleY",4f);
    AnimatorSet animSetXY = new AnimatorSet();
    animSetXY.playTogether(scaleX, scaleY);
    animSetXY.setDuration(duration);
    final View.DragShadowBuilder shadow = new View.DragShadowBuilder(this);
    animSetXY.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            v.startDrag(dragData,  // the data to be dragged
                    new CustomDragShadowBuilder(yourView) ,  // the drag shadow builder
                    null,
                    0          // flags (not currently used, set to 0)
            );
        }
    });
    animSetXY.start();
person yshahak    schedule 25.03.2015