I am trying a pattern in my app. I have 5 images in a LinearLayout.When i drag and drop an one image at other position then,images positions should be updated. for example:
1 2 3 4 5 //suppose these are my images I pick up 5 image and drop inbetween 3,4..
after dropping the sequence should be like:
1 2 3 5 4 I have written following code:
import android.content.ClipData; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { float orix,origy; LinearLayout llcontainer; ImageView iv1,iv2,iv3,iv4; ArrayList<Integer> alim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); llcontainer=(LinearLayout)findViewById(R.id.llcontainer); iv1=(ImageView)findViewById(R.id.iv1); iv2=(ImageView)findViewById(R.id.iv2); iv3=(ImageView)findViewById(R.id.iv3); alim=new ArrayList<>(); for(int i=0;i<5;i++) { ImageView iv=new ImageView(this); iv.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); iv.setId(i); iv.setImageResource(R.mipmap.ic_launcher); alim.add(iv.getId()); iv.setOnDragListener(new MyDragListener()); iv.setOnTouchListener(new MyTouchListener()); llcontainer.addView(iv); } // alim.add(R.id.iv1); // alim.add(R.id.iv2); // alim.add(R.id.iv3); // iv1.setOnTouchListener(new MyTouchListener()); // iv2.setOnTouchListener(new MyTouchListener()); //iv3.setOnTouchListener(new MyTouchListener()); //findViewById(1).setOnDragListener(new MyDragListener()); //iv2.setOnDragListener(new MyDragListener()); //iv3.setOnDragListener(new MyDragListener()); llcontainer.setOnDragListener(new MyDragListener()); /* findViewById(R.id.myimage1).setOnTouchListener(new MyTouchListener()); findViewById(R.id.myimage2).setOnTouchListener(new MyTouchListener()); findViewById(R.id.myimage3).setOnTouchListener(new MyTouchListener()); findViewById(R.id.myimage4).setOnTouchListener(new MyTouchListener()); findViewById(R.id.topleft).setOnDragListener(new MyDragListener()); findViewById(R.id.topright).setOnDragListener(new MyDragListener()); findViewById(R.id.bottomleft).setOnDragListener(new MyDragListener()); findViewById(R.id.bottomright).setOnDragListener(new MyDragListener()); */ } private final class MyTouchListener implements View.OnTouchListener { public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { ClipData data = ClipData.newPlainText("", ""); View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder( view); view.startDrag(data, shadowBuilder, view, 0); view.setVisibility(View.INVISIBLE); origy=view.getY(); orix=view.getX(); return true; } else { return false; } } } class MyDragListener implements View.OnDragListener { /*Drawable enterShape = getResources().getDrawable( R.drawable.shape_droptarget); Drawable normalShape = getResources().getDrawable(R.drawable.shape); */ @Override public boolean onDrag(View v, DragEvent event) { int action = event.getAction(); switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: // do nothing // Toast.makeText(getApplicationContext(),"drag started",Toast.LENGTH_LONG).show(); break; case DragEvent.ACTION_DRAG_ENTERED: // v.setBackgroundDrawable(enterShape); break; case DragEvent.ACTION_DRAG_EXITED: // v.setBackgroundDrawable(normalShape); break; case DragEvent.ACTION_DROP: // Dropped, reassign View to ViewGroup float X = event.getX(); float Y = event.getY(); int id=v.getId(); // for(int i=0;i<alim.size();i++) // { //if(id==alim.get(i)) // { View view = (View) event.getLocalState(); int owner=(int)view.getId(); if(alim.size()==owner+1) { Toast.makeText(getApplicationContext(),"matched",Toast.LENGTH_LONG).show(); ImageView v1=(ImageView) llcontainer.getChildAt(owner); v1.setX(X); v1.setY(Y); v1.setVisibility(View.VISIBLE); ImageView ig=(ImageView)llcontainer.findViewById(owner-1); ig.setX(orix); ig.setY(origy); ig.setVisibility(View.VISIBLE); //ig } // llcontainer.addView(ig); // ig.setX(X); //ig.setY(Y); // } // } /* View view = (View) event.getLocalState(); ViewGroup owner = (ViewGroup) view.getParent(); owner.removeView(view); LinearLayout container = (LinearLayout) v; if(X>container.getX()&&Y>container.getY()) { container.setOrientation(LinearLayout.HORIZONTAL); // int position=owner.indexOfChild(v); // view.setX(X); // view.setY(Y); view.setX(X-(view.getWidth()/2)); view.setY(Y-(view.getHeight()/2)); container.addView(view); view.setVisibility(View.VISIBLE); } else { owner.addView(view); view.setX(orix); view.setY(origy); view.setVisibility(View.VISIBLE); }*/ break; case DragEvent.ACTION_DRAG_ENDED: // v.setBackgroundDrawable(normalShape); default: break; } return true; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } In my activity_main.xml
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/llcontainer" android:orientation="horizontal" > Please help out friends.Thanks in advance.