Created
October 15, 2017 12:56
-
-
Save furq/8f9786be7f28ae16294bf640812f5e4d to your computer and use it in GitHub Desktop.
DRAG AND DROP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.furq.dragableimagecollage; | |
import android.animation.Animator; | |
import android.animation.AnimatorListenerAdapter; | |
import android.animation.ValueAnimator; | |
import android.graphics.Rect; | |
import android.support.v7.app.AppCompatActivity; | |
import android.os.Bundle; | |
import android.support.v7.widget.GridLayout; | |
import android.view.DragEvent; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.animation.OvershootInterpolator; | |
import android.widget.ScrollView; | |
import android.widget.TextView; | |
public class MainActivity extends AppCompatActivity { | |
private static final int ITEMS = 10; | |
private GridLayout mGrid; | |
private ScrollView mScrollView; | |
private ValueAnimator mAnimator; | |
private Boolean isScroll = false; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
mScrollView = (ScrollView)findViewById(R.id.scrollView); | |
mScrollView.setSmoothScrollingEnabled(true); | |
mGrid = (GridLayout) findViewById(R.id.grid); | |
mGrid.setOnDragListener(new DragListener()); | |
final LayoutInflater inflater = LayoutInflater.from(this); | |
for (int i = 0; i < ITEMS; i++) { | |
final View itemView = inflater.inflate(R.layout.item, mGrid, false); | |
final TextView text = (TextView) itemView.findViewById(R.id.text); | |
text.setText(String.valueOf(i + 1)); | |
itemView.setOnLongClickListener(new LongPressListener()); | |
mGrid.addView(itemView); | |
} | |
} | |
class DragListener implements View.OnDragListener { | |
@Override | |
public boolean onDrag(View v, DragEvent event) { | |
final View view = (View) event.getLocalState(); | |
switch (event.getAction()) { | |
case DragEvent.ACTION_DRAG_LOCATION: | |
if (view == v) return true; | |
// get the new list index | |
final int index = calculateNextIndex(event.getX(), event.getY()); | |
final Rect rect = new Rect(); | |
mScrollView.getHitRect(rect); | |
final int scrollY = mScrollView.getScrollY(); | |
if (event.getY() - scrollY > mScrollView.getBottom() - 250) { | |
startScrolling(scrollY, mGrid.getHeight()); | |
} else if (event.getY() - scrollY < mScrollView.getTop() + 250) { | |
startScrolling(scrollY, 0); | |
} else { | |
stopScrolling(); | |
} | |
// remove the view from the old position | |
mGrid.removeView(view); | |
//add new view | |
mGrid.addView(view, index); | |
break; | |
case DragEvent.ACTION_DROP: | |
view.setVisibility(View.VISIBLE); | |
break; | |
case DragEvent.ACTION_DRAG_ENDED: | |
if (!event.getResult()) { | |
view.setVisibility(View.VISIBLE); | |
} | |
break; | |
} | |
return true; | |
} | |
} | |
private void startScrolling(int from, int to) { | |
if (from != to && mAnimator == null) { | |
isScroll=true; | |
mAnimator = new ValueAnimator(); | |
mAnimator.setInterpolator(new OvershootInterpolator()); | |
mAnimator.setDuration(Math.abs(to - from)); | |
mAnimator.setIntValues(from, to); | |
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { | |
@Override | |
public void onAnimationUpdate(ValueAnimator valueAnimator) { | |
mScrollView.smoothScrollTo(0, (int) valueAnimator.getAnimatedValue()); | |
} | |
}); | |
mAnimator.addListener(new AnimatorListenerAdapter() { | |
@Override | |
public void onAnimationEnd(Animator animation) { | |
isScroll=false; | |
mAnimator = null; | |
} | |
}); | |
mAnimator.start(); | |
} | |
} | |
private void stopScrolling() { | |
if (mAnimator != null) { | |
mAnimator.cancel(); | |
} | |
} | |
private int calculateNextIndex(float x, float y) { | |
// calculate which column to move to | |
final float cellWidth = mGrid.getWidth() / mGrid.getColumnCount(); | |
final int column = (int)(x / cellWidth); | |
final float cellHeight = mGrid.getHeight() / mGrid.getRowCount(); | |
final int row = (int)Math.floor(y / cellHeight); | |
int index = row * mGrid.getColumnCount() + column; | |
if (index >= mGrid.getChildCount()) { | |
index = mGrid.getChildCount() - 1; | |
} | |
return index; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi Furq, Can i get complete source of this proj ?