Mega Code Archive

 
Categories / Android / UI
 

Drag and drop

package app.test; import android.animation.ObjectAnimator; import android.app.Activity; import android.app.Fragment; import android.content.ClipData; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.DragEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.CycleInterpolator; import android.widget.TextView; class Dot extends View implements View.OnDragListener {   private static final int DEFAULT_RADIUS = 50;   private static final int DEFAULT_COLOR = Color.WHITE;   private static final int SELECTED_COLOR = Color.MAGENTA;   protected static final String DOTTAG = "DragDot";   private Paint mNormalPaint;   private Paint mDraggingPaint;   private int mColor = DEFAULT_COLOR;   private int mRadius = DEFAULT_RADIUS;   private boolean inDrag;   public Dot(Context context, AttributeSet attrs) {     super(context, attrs);     mNormalPaint = new Paint();     mNormalPaint.setColor(mColor);     mNormalPaint.setAntiAlias(true);     mDraggingPaint = new Paint();     mDraggingPaint.setColor(SELECTED_COLOR);     mDraggingPaint.setAntiAlias(true);     setOnLongClickListener(lcListener);     setOnDragListener(this);   }   private static View.OnLongClickListener lcListener = new View.OnLongClickListener() {     private boolean mDragInProgress;     public boolean onLongClick(View v) {       ClipData data = ClipData.newPlainText("DragData",           (String) v.getTag());       mDragInProgress = v.startDrag(data, new View.DragShadowBuilder(v),           (Object) v, 0);       Log.v((String) v.getTag(), "starting drag? " + mDragInProgress);       return true;     }   };   @Override   protected void onMeasure(int widthSpec, int heightSpec) {     int size = 2 * mRadius + getPaddingLeft() + getPaddingRight();     setMeasuredDimension(size, size);   }   public boolean onDrag(View v, DragEvent event) {     String dotTAG = (String) getTag();     if (event.getLocalState() != this) {       return false;     }     boolean result = true;     int action = event.getAction();     float x = event.getX();     float y = event.getY();     switch (action) {     case DragEvent.ACTION_DRAG_STARTED:       inDrag = true;       break;     case DragEvent.ACTION_DRAG_LOCATION:       break;     case DragEvent.ACTION_DRAG_ENTERED:       break;     case DragEvent.ACTION_DRAG_EXITED:       break;     case DragEvent.ACTION_DROP:       result = false;       break;     case DragEvent.ACTION_DRAG_ENDED:       inDrag = false; // change color of original dot back       break;     default:       result = false;       break;     }     return result;   }   public void draw(Canvas canvas) {     float cx = this.getWidth() / 2 + getLeftPaddingOffset();     float cy = this.getHeight() / 2 + getTopPaddingOffset();     Paint paint = mNormalPaint;     if (inDrag)       paint = mDraggingPaint;     canvas.drawCircle(cx, cy, mRadius, paint);     invalidate();   } } class DropZone extends Fragment {   private View dropTarget;   private TextView dropMessage;   @Override   public View onCreateView(LayoutInflater inflater, ViewGroup container,       Bundle icicle) {     View v = inflater.inflate(R.layout.row, container, false);     dropMessage = (TextView) v.findViewById(R.id.dropmessage);     dropTarget = (View) v.findViewById(R.id.droptarget);     dropTarget.setOnDragListener(new View.OnDragListener() {       private static final String DROPTAG = "DropTarget";       private int dropCount = 0;       private ObjectAnimator anim;       public boolean onDrag(View v, DragEvent event) {         int action = event.getAction();         boolean result = true;         switch (action) {         case DragEvent.ACTION_DRAG_STARTED:           break;         case DragEvent.ACTION_DRAG_ENTERED:           anim = ObjectAnimator               .ofFloat((Object) v, "alpha", 1f, 0.5f);           anim.setInterpolator(new CycleInterpolator(40));           anim.setDuration(30 * 1000);           anim.start();           break;         case DragEvent.ACTION_DRAG_EXITED:           if (anim != null) {             anim.end();             anim = null;           }           break;         case DragEvent.ACTION_DRAG_LOCATION:           Log.v(DROPTAG,               "drag proceeding in dropTarget: " + event.getX()                   + ", " + event.getY());           break;         case DragEvent.ACTION_DROP:           Log.v(DROPTAG, "drag drop in dropTarget");           if (anim != null) {             anim.end();             anim = null;           }           ClipData data = event.getClipData();           Log.v(DROPTAG, "Item data is "               + data.getItemAt(0).getText());           dropCount++;           String message = dropCount + " drop";           if (dropCount > 1)             message += "s";           dropMessage.setText(message);           break;         case DragEvent.ACTION_DRAG_ENDED:           Log.v(DROPTAG, "drag ended in dropTarget");           if (anim != null) {             anim.end();             anim = null;           }           break;         default:           Log.v(DROPTAG, "other action in dropzone: " + action);           result = false;         }         return result;       }     });     return v;   } } class Palette extends Fragment {   @Override   public View onCreateView(LayoutInflater inflater, ViewGroup container,       Bundle icicle) {     View v = inflater.inflate(R.layout.add_edit, container, false);     return v;   } } public class Test extends Activity {   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);   } } //layout/main.xml <?xml version="1.0" encoding="utf-8"?> <!-- This file is res/layout/main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="match_parent">     <fragment class="app.test.TitlesFragment"             android:id="@+id/titles"             android:layout_width="match_parent"             android:layout_height="match_parent" />             android:background="#00550033" />     <FrameLayout             android:id="@+id/details" android:layout_weight="2"             android:layout_width="0px"             android:layout_height="match_parent" /> </LinearLayout> //row.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:orientation="horizontal" >      <View android:id="@+id/droptarget"     android:layout_width="75dp"     android:layout_height="75dp"     android:layout_gravity="center_vertical"     android:background="#00ff00" />   <TextView android:id="@+id/dropmessage"     android:text="0 drops"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_gravity="center_vertical"     android:paddingLeft="50dp"     android:textSize="17sp" /> </LinearLayout> //add_edit.xml <?xml version="1.0" encoding="utf-8"?> <!-- This file is res/layout/palette.xml --> <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:dot="http://schemas.android.com/apk/res/app.test.demo"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:orientation="vertical">   <app.test.Dot android:id="@+id/dot1"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:padding="30dp"     android:tag="Blue dot"     dot:color="#ff1111ff"     dot:radius="20dp"   />   <app.test.Dot android:id="@+id/dot2"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:padding="10dp"     android:tag="White dot"     dot:color="#ffffffff"     dot:radius="40dp"   /> </LinearLayout>