Question

    public class MyActivity extends Activity implements View.OnTouchListener {

    TextView _view;
    ViewGroup _root;
    private int _xDelta;
    private int _yDelta;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        _root = (ViewGroup)findViewById(R.id.root);

        _view = new TextView(this);
        _view.setText("TextView!!!!!!!!");

        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 50);
        layoutParams.leftMargin = 50;
        layoutParams.topMargin = 50;
        layoutParams.bottomMargin = -250;
        layoutParams.rightMargin = -250;
        _view.setLayoutParams(layoutParams);

        _view.setOnTouchListener(this);
        _root.addView(_view);
    }

    public boolean onTouch(View view, MotionEvent event) {
        final int X = (int) event.getRawX();
        final int Y = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                _xDelta = X - lParams.leftMargin;
                _yDelta = Y - lParams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                layoutParams.leftMargin = X - _xDelta;
                layoutParams.topMargin = Y - _yDelta;
                layoutParams.rightMargin = -250;
                layoutParams.bottomMargin = -250;
                view.setLayoutParams(layoutParams);
                break;
        }
        _root.invalidate();
        return true;
    }}

I have doing this code for moving edittext and imageview.It's moving fine but it moves also outside the relative layout.I have to put restriction for moving only in particular layout.Anyone have suggestion?

Était-ce utile?

La solution

Check out Drag & Drop Functionality Code below which i have implemented:

DragAndDrop.java

  public class DragAndDrop extends Activity
   {
private ImageView m_ivImage, m_ivImage1;
private int m_counter = 0;
float m_lastTouchX, m_lastTouchY, m_posX, m_posY, m_prevX, m_prevY, m_imgXB, m_imgYB, m_imgXC, m_imgYC, m_dx, m_dy;
private LinearLayout m_llTop;
private AbsoluteLayout m_alTop;
private Button m_btnAddView, m_btnRemove;
private Context m_context;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    m_context = this;

    m_prevX = 0;
    m_prevY = 0;
    m_imgXB = 50;
    m_imgYB = 100;
    m_imgXC = 150;
    m_imgYC = 100;

    m_ivImage = (ImageView) findViewById(R.id.ivImage);
    m_ivImage1 = (ImageView) findViewById(R.id.ivImage1);
    m_llTop = (LinearLayout) findViewById(R.id.llTop);
    m_alTop = (AbsoluteLayout) findViewById(R.id.alTop);
    m_btnAddView = (Button) findViewById(R.id.btnAdd);
    m_btnRemove = (Button) findViewById(R.id.btnRemove);

    m_ivImage.setOnTouchListener(m_onTouchListener);
    m_ivImage1.setOnTouchListener(m_onTouchListener);
    m_btnAddView.setOnClickListener(m_onClickListener);
    m_btnRemove.setOnClickListener(m_onClickListener);

}

/**
 * Common click listener for clickable controls
 */
OnClickListener m_onClickListener = new OnClickListener(){

    @Override
    public void onClick(View p_v)
    {
        switch (p_v.getId())
            {
                case R.id.btnAdd:
                    addView();
                    break;
                case R.id.btnRemove:
                    removeView();
                    break;
                default:
                    break;
            }
    }
};

/**
 * Touch listener for view
 */
OnTouchListener m_onTouchListener = new OnTouchListener(){

    @Override
    public boolean onTouch(View p_v, MotionEvent p_event)
    {
        switch (p_event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                {
                    m_lastTouchX = p_event.getX();
                    m_lastTouchY = p_event.getY();
                    break;
                }
                case MotionEvent.ACTION_UP:
                {
                    break;
                }

                case MotionEvent.ACTION_MOVE:
                {
                    m_dx = p_event.getX() - m_lastTouchX;
                    m_dy = p_event.getY() - m_lastTouchY;

                    m_posX = m_prevX + m_dx;
                    m_posY = m_prevY + m_dy;

                    if (m_posX > 0 && m_posY > 0 && (m_posX + p_v.getWidth()) < m_alTop.getWidth() && (m_posY + p_v.getHeight()) < m_alTop.getHeight())
                    {
                        p_v.setLayoutParams(new AbsoluteLayout.LayoutParams(p_v.getMeasuredWidth(), p_v.getMeasuredHeight(), (int) m_posX, (int) m_posY));

                        m_prevX = m_posX;
                        m_prevY = m_posY;

                    }

                    break;

                }

            }
        return true;
    }
};

/**
 * Add view dynamically for drag and drop
 */
private void addView()
{
    ImageView m_img = new ImageView(m_context);
    if (m_counter < 5)
    {
            m_img.setBackgroundResource(R.drawable.ic_launcher);
            m_alTop.addView(m_tv, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB)));
            m_alTop.addView(m_img, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB)));

        m_counter++;
        if (m_counter == 5)
            m_btnAddView.setEnabled(false);
    }

    m_img.setOnTouchListener(m_onTouchListener);
    m_tv.setOnTouchListener(m_onTouchListener);
}

public void removeView()
{
    m_counter = 0;
    m_alTop.removeAllViews();
    m_alTop.invalidate();
    m_btnAddView.setEnabled(true);
}

Layout file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/llTop"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <AbsoluteLayout
        android:id="@+id/alTop"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_margin="10dp"
        android:layout_weight=".70"
         >

        <ImageView
            android:id="@+id/ivImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:src="@drawable/ic_menu_share"
            android:visibility="gone" />

        <ImageView
            android:id="@+id/ivImage1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:layout_x="193dp"
            android:layout_y="29dp"
            android:src="@drawable/ic_launcher" />
    </AbsoluteLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_weight=".30" >

        <Button
            android:id="@+id/btnAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@string/addview" />

        <Button
            android:id="@+id/btnRemove"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@string/removeview"
            android:visibility="visible" />
    </LinearLayout>

</LinearLayout>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top