0
    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?

immodi
  • 607
  • 1
  • 6
  • 21

1 Answers1

1

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>
GrIsHu
  • 29,068
  • 10
  • 64
  • 102
  • thanks for reply but it's not working for me.when I used absolute layout, that view is not moving.It stay static.I need only layout's current height and width in Action view as like you define in if condition.Is this possible? – immodi Oct 23 '13 at 12:59
  • Yes you can get layout's current height and width as i have defined and restrict it in my code. You may have missed the view's touch listener to move it. – GrIsHu Oct 23 '13 at 13:03
  • No..I cant restrict it in only LinearLayout.And second problem is When I moving latest edittext or imageview, it also moving oldest edittext or imageview.I added you in Google+.Any solution for this? – immodi Oct 23 '13 at 15:04
  • Have you tried with my code ? It works perfect. Just try with my code. – GrIsHu Oct 24 '13 at 04:27
  • ok..apart from this problem.Can we store height,width,xaxis and yaxis of layout and inner layouts? – immodi Oct 24 '13 at 08:32
  • Yes you can store it. But its bit complicated to take each view's height,width,xaxis,yaxis etc.. and store it and manage it. – GrIsHu Oct 24 '13 at 08:38
  • Actually I stored height,width,xaxis and yaxis of layout and as per this data layout will displayed.Is this possible? – immodi Oct 24 '13 at 08:46
  • How can i get layout's position like as header or footer? – immodi Oct 24 '13 at 11:44
  • @GrlsHu, thanks for replied..I got it.I make layout from database. – immodi Oct 31 '13 at 06:17
  • Glad to help. Vote the answer if it helped you. :) – GrIsHu Oct 31 '13 at 06:22
  • @GrlsHu, Can i chat with you on Google+? I need more help. – immodi Oct 31 '13 at 06:47
  • Are you online on Google+? – immodi Oct 31 '13 at 06:59
  • Yes... what is your id ? – GrIsHu Oct 31 '13 at 07:23
  • Hi @GrlsHu, can u know how to reload current activity? – immodi Nov 08 '13 at 08:52