package v2.simpleUi.util;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LightingColorFilter;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public abstract class DragAndDropListener implements OnTouchListener {
private RelativeLayout container;
private ImageView imageView;
private LayoutParams params;
@Override
public boolean onTouch(View v, MotionEvent motionEvent) {
return drag(motionEvent, v);
}
private boolean drag(MotionEvent event, View v) {
v.getParent().requestDisallowInterceptTouchEvent(true);
Activity activity = (Activity) v.getContext();
LayoutParams params = getDragDropContainerParams(activity);
RelativeLayout container = getDragDropContainer(activity);
ImageView imageView = getImageView(v, activity, container, params);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
updatePos(event, v, params, imageView);
break;
}
case MotionEvent.ACTION_UP: {
updatePos(event, v, params, imageView);
container.setVisibility(View.GONE);
onElementDropped(event.getRawX(), event.getRawY());
break;
}
case MotionEvent.ACTION_DOWN: {
updatePos(event, v, params, imageView);
container.setVisibility(View.VISIBLE);
break;
}
}
return true;
}
public abstract void onElementDropped(float rawX, float rawY);
public void updatePos(MotionEvent event, View v, LayoutParams params,
ImageView imageView) {
params.topMargin = (int) event.getRawY() - (v.getHeight());
params.leftMargin = (int) event.getRawX() - (v.getWidth() / 2);
imageView.setLayoutParams(params);
}
private ImageView getImageView(View source, Activity activity,
RelativeLayout c, LayoutParams params) {
if (imageView == null) {
final Bitmap bitmap = IO.loadBitmapFromView(source);
final Paint shadowPaint = new Paint();
shadowPaint.setAlpha(180);
// http://stackoverflow.com/questions/7048941/how-to-use-the-lightingcolorfilter-to-make-the-image-form-dark-to-light
shadowPaint.setColorFilter(new LightingColorFilter(0x11333333,
0x00000000));
imageView = new ImageView(activity) {
@Override
protected void onDraw(Canvas canvas) {
// First draw shadow
float dist = 2;
canvas.drawBitmap(bitmap, dist, dist, shadowPaint);
// then draw normal image view
super.onDraw(canvas);
}
};
imageView.setImageBitmap(bitmap);
c.addView(imageView);
}
return imageView;
}
private android.widget.RelativeLayout.LayoutParams getDragDropContainerParams(
Context context) {
if (params == null) {
params = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
}
return params;
}
private RelativeLayout getDragDropContainer(Activity activity) {
if (container == null) {
container = new RelativeLayout(activity);
activity.addContentView(container, params);
}
return container;
}
}