Android - 拖放 - 动画阴影到目的地

Posted

技术标签:

【中文标题】Android - 拖放 - 动画阴影到目的地【英文标题】:Android - Drag and Drop - Animation shadow to destination 【发布时间】:2017-02-21 06:56:10 【问题描述】:

我想将ShadowView 动画到某个坐标(到目标视图)。

我正在使用 D&D,如果用户掉落 (DragEvent.ACTION_DROP),那么我想将某个区域的视图(从放置位置)动画化到某个目标视图。

我不想从源位置为视图设置动画,但想从 DROP 位置进行。

我尝试了很多东西,但没有任何效果。如何访问ShadowView?这也不起作用:

EventDragShadowBuilder.getView()

我认为TranslateAnimation 应该可以解决这个问题,但我需要在 D&D 期间访问“影子”视图。

图片:

【问题讨论】:

我认为您无法访问 ShadowView。如果您可以获取放置的位置,您可以自己创建一个与 ShadowView 具有相同背景的重复视图,并将此重复视图动画到目的地,从而产生 ShdowView 本身正在移动的错觉。 【参考方案1】:

首先在视图上实现onTouchlistener

llDragable.setOnTouchListener(this);

使视图可拖动

@Override
public boolean onTouch(View view, MotionEvent event) 
    float dX = 0;
    float dY = 0;
    switch (view.getId())
        case R.id.dragableLayout :
            switch (event.getActionMasked()) 
                case MotionEvent.ACTION_DOWN:
                    dX = view.getX() - event.getRawX();
                    dY = view.getY() - event.getRawY();
                    lastAction = MotionEvent.ACTION_DOWN;
                    break;

                case MotionEvent.ACTION_MOVE:
                    view.setY(event.getRawY() + dY);
                    view.setX(event.getRawX() + dX);
                    lastAction = MotionEvent.ACTION_MOVE;
                    break;

                case MotionEvent.ACTION_UP:
                    //Animate
                    animate();
                    if (lastAction == MotionEvent.ACTION_DOWN)
                        //Toast.makeText(DraggableView.this, "Clicked!", Toast.LENGTH_SHORT).show();
                        break;

                default:
                    return false;
            
            return true;
        
    
    return false;

然后您可以在案例 MotionEvent.ACTION_UP 中使用对象动画师使用对象动画。你需要有目的地的位置。

private void animate() 
    Path path = new Path();
    path.moveTo(destinationX, destinationY);
    path.lineTo(destinationX, destinationY);
    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mButton, View.X, View.Y, path);
    objectAnimator.setDuration(duration);
    objectAnimator.setInterpolator(new LinearInterpolator());
    objectAnimator.start();

【讨论】:

【参考方案2】:

一种可能的情况是

拖动事件完成后,您可以将“视图”移动到放置位置,然后您可以启动动画将视图从放置位置移动到目标位置。

请记住,这里的拖动阴影不是动画,而是视图本身正在动画。

【讨论】:

【参考方案3】:

作为一种解决方法,您可以尝试添加一个具有透明和黑色渐变可绘制对象的选择器,具体取决于适当的状态。在这种情况下,您将决定何时显示“影子”以及何时消失。

这是一个关于“阴影”边框布局的问题: android LinearLayout : Add border with shadow around a linearLayout

不确定,这是不是一个好方法……但它可能会奏效。 祝你好运!

【讨论】:

【参考方案4】:

为您拖动的视图创建一个重复视图。拖动结束后,您将获得视图的位置或放下坐标。一旦发生这种情况,请将“真实”视图的可见性设置为 View.INVISIBLE。然后将临时不可见视图的 x 和 y 设置为下车点的 x 和 y 并使其可见。之后,创建一个平移动画,将临时视图动画到所需位置,不要忘记将平移动画的 setFillEnabled 和 setFillAfter 属性设置为 true。

【讨论】:

以上是关于Android - 拖放 - 动画阴影到目的地的主要内容,如果未能解决你的问题,请参考以下文章

Android中实现popupwindow(全屏+阴影+动画)

如何在内容增长的同时为 UIView 的阴影边框设置动画

Android 拖动阴影的“目标点”如何从其“接触点”移开?

用 CSS 设计漂亮的阴影,css阴影和原理,所有知识点多图动画演示

css CSS动画阴影文本 - 剪辑到文本

从Android动画到贝塞尔曲线