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

时间:2016-10-12 12:55:37

标签: android animation drag-and-drop

我想将ShadowView设置为某些坐标(到目标视图)。

我使用D& D并且如果用户放弃(DragEvent.ACTION_DROP),那么我希望在某些区域中为视图设置视图(从放置位置)到某个目标视图。

我不想从源位置设置动画视图,但想从DROP位置开始。

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

EventDragShadowBuilder.getView()

我认为TranslateAnimation应该适用于此,但我需要访问"影子"在D& D期间查看。

图片:enter image description here

4 个答案:

答案 0 :(得分:2)

首先在视图上实现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;
}

然后,您可以在使用对象Animation的情况下将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();
}

答案 1 :(得分:0)

一件可能的事情可能是

一旦拖动事件结束,您可以将“视图”移动到放置的位置,然后您可以启动动画以将视图从放置的位置移动到目标。

请记住,拖动阴影没有动画,但视图本身正在动画化。

答案 2 :(得分:0)

作为一种解决方法,您可以尝试添加具有透明和黑色渐变drawable的选择器,具体取决于适当的状态。在这种情况下,你将决定,当你的"阴影"应该显示,什么时候应该消失。

这是一个关于" shadow"的问题。有边界的布局: Android LinearLayout : Add border with shadow around a linearLayout

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

答案 3 :(得分:0)

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