Android - 在触摸的xy位置插入textview,其中视图重叠触及另一个视图

时间:2015-12-12 13:25:33

标签: android android-layout touch android-relativelayout

这是我面临的问题。在空的相对布局上,当触摸的textview在触摸的x y位置被实例化时。我得到了这么正确,但问题是当我触摸已经实例化的视图附近的空白区域时,先前的视图和当前放置的视图是重叠的。我尝试获取布局的子视图并检查当前视图和已经放置的视图使用矩形数据,如果它们相交。如何解决这个问题呢?

以下是代码:

public class MainActivity extends AppCompatActivity
{
    private int id = 0;
    private RelativeLayout root;
    private RelativeLayout.LayoutParams params;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_designer);

        root = (RelativeLayout) findViewById(R.id.rootlayout);
        root.setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                switch(event.getAction())
                {
                    case MotionEvent.ACTION_DOWN:
                        instantiateView(v, event);
                    break;
                }

                return true;
            }
        });
    }

    private void instantiateView(View v, MotionEvent event)
    {
        int x = (int) event.getX();
        int y = (int) event.getY();

        TextView bt = new TextView(DesignerActivity.this);
        bt.setText("1");
        bt.setId(++id);
        bt.setBackgroundColor(Color.BLACK);
        bt.setTextColor(Color.WHITE);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showDialog();
            }
        });
        params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(x, y, 0, 0);
        bt.setLayoutParams(params);
        //((ViewGroup) v).addView(bt);

        if(root.getChildCount() <= 0)
        {
            ((ViewGroup) v).addView(bt);
        }
        else
        {
            for (int i = 0; i < root.getChildCount(); i++)
            {
                if (!checkCollision(bt, root.getChildAt(i)))
                {
                    if(bt != root.getChildAt(i))
                    {
                        ((ViewGroup) v).addView(bt);
                    }
                }
            }
        }
    }

    private void showDialog()
    {
        final Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.dialog_layout);
        Button editBtn = (Button) dialog.findViewById(R.id.button1);
        Button deleteBtn = (Button) dialog.findViewById(R.id.button2);

        editBtn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                dialog.dismiss();
            }
        });
        deleteBtn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                dialog.dismiss();
            }
        });

        dialog.show();
    }

    private boolean checkCollision(View v1, View v2)
    {
        Rect r1 = new Rect(v1.getLeft(), v1.getTop(), v1.getRight(), v1.getBottom());
        Rect r2 = new Rect(v2.getLeft(), v2.getTop(), v2.getRight(), v2.getBottom());

        return r1.intersect(r2);
    }
}

1 个答案:

答案 0 :(得分:0)

您正在使用相对布局,这就是您的文字视图重叠的原因。

如果您不想重叠并希望将其放置在重叠视图的下一个或其他位置,那么这是您的决定。只需检查它们是否相交,并根据您的要求做出适当的决定。

以下是您的代码中的问题。

Rect r1 = new Rect(v1.getLeft(),v1.getTop(),v1.getRight(),v1.getBottom());

您设置参数'保证金并不意味着您将获得所需的左,上,右,下值。您将在视图层次结构充气后立即获得这些值。

您可以使用此功能:

 private boolean checkCollision(View v1, View v2)
{
    int leftMargin = ((RelativeLayout.LayoutParams) v1.getLayoutParams()).leftMargin;

    int topMargin = ((RelativeLayout.LayoutParams) v1.getLayoutParams()).topMargin;

    Rect r1 = new Rect(root.getPaddingLeft() + leftMargin, root.getPaddingTop() + topMargin,
            root.getPaddingLeft() + leftMargin + v2.getWidth(), root.getPaddingTop() + topMargin + v2.getHeight());
    Rect r2 = new Rect(v2.getLeft(), v2.getTop(), v2.getRight(), v2.getBottom());

    return r1.intersect(r2);
}

之后使用

params.addRule();根据您的要求,您可以放置​​重叠的视图。