【问题标题】:Android - Insert textview on the touched xy position where views overlap touched close to another viewAndroid - 在触摸的 xy 位置插入文本视图,其中视图重叠触摸靠近另一个视图
【发布时间】:2015-12-12 13:25:33
【问题描述】:

这是我面临的问题。在空的相对布局上,当触摸 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);
    }
}

【问题讨论】:

    标签: android android-layout touch android-relativelayout


    【解决方案1】:

    您使用的是相对布局,这就是您的 Textview 重叠的原因。

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

    下面是代码中的问题。

    矩形 r1 = 新矩形(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(); 根据您要放置重叠视图的要求。

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多