Android将ImageView拖放到另一个ImageView中

时间:2017-07-14 14:14:49

标签: android drag-and-drop android-imageview

我在Android拖放中遇到了这个问题。我已经在stackoverflow上阅读了文档和多个问题/答案 问题是:
我有3个ImageView可以移动到另外3个ImageView中,但是当我开始拖动其中一个ImageView时,我可以将其放入一个ImageView区域内。

Here the code!。基本上我会看到只有 dropViewArancio 区域,即使我拖动其他ImageView。 我想要的是将所有3个区域激活,我可以放下3个ImageView中的一个。 感谢您的支持!

2 个答案:

答案 0 :(得分:0)

ImageView内部不能包含另一个View,只有从ViewGroup派生的类才可以。然后你可以将ImageView移到另一个上面或后面(取决于Z顺序)但不在里面。

这是一个如何使用onTouch移动RelativeLayout中包含的所有视图的工作示例。我认为onDrag事件更适用于拖放数据项,而不是移动视图。希望它会有所帮助

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    private RelativeLayout mRelLay;
    private float mInitialX, mInitialY;
    private int mInitialLeft, mInitialTop;
    private View mMovingView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRelLay = (RelativeLayout) findViewById(R.id.relativeLayout);

        for (int i = 0; i < mRelLay.getChildCount(); i++)
            mRelLay.getChildAt(i).setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        RelativeLayout.LayoutParams mLayoutParams;

        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mMovingView = view;
                mLayoutParams = (RelativeLayout.LayoutParams) mMovingView.getLayoutParams();
                mInitialX = motionEvent.getRawX();
                mInitialY = motionEvent.getRawY();
                mInitialLeft = mLayoutParams.leftMargin;
                mInitialTop = mLayoutParams.topMargin;
                break;

            case MotionEvent.ACTION_MOVE:
                if (mMovingView != null) {
                    mLayoutParams = (RelativeLayout.LayoutParams) mMovingView.getLayoutParams();
                    mLayoutParams.leftMargin = (int) (mInitialLeft + motionEvent.getRawX() - mInitialX);
                    mLayoutParams.topMargin = (int) (mInitialTop + motionEvent.getRawY() - mInitialY);
                    mMovingView.setLayoutParams(mLayoutParams);
                }
                break;

            case MotionEvent.ACTION_UP:
                mMovingView = null;
                break;
        }

        return true;
    }
}

答案 1 :(得分:0)

所以,我已经在tutorial之后解决了我的问题。无论如何,我的渴望解决方案是类似的this,这是一个混合教程和以前的链接的完美方式。谢谢大家的帮助。