Xem mẫu
- Trung tâm Tin học – ĐH KHTN
Drag và Drop trên Android 3.0
Một trong những cải tiến của Android 3.0 so với các đ ời Android tr ước là h ỗ tr ợ tr ực
tiếp cho lập trình viên về việc lập trình xử lý Drag, Drop. Trong bài vi ết sau đây mình
sẽ tạo 1 ứng dụng nho nhỏ demo cho tính năng này.
1/ Các bạn tạo Project như sau:
Project name: DragDropDemo
Build Target: Android 3.0
Application name: DragDropDemo
Package name: com.dac.drag.drop.demo
Create Activity: MainActivity
2/ Trong folder Layout các bạn tạo 2 file lay out đ ể dùng làm fragment cho ứng d ụng :
+ dropzone.xml :
Lập trình Android – http://laptrinhdidong.vn Page 1
- Trung tâm Tin học – ĐH KHTN
+ Palette.xml:
Trong file main.xml các bạn sữ dụng 2 file trên:
- Trung tâm Tin học – ĐH KHTN
android:id="@+id/dropzone"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2">
3/ Trong folder values/ các bạn tạo file attrs.xml để quy đ ịnh thuoc tính cho 2 nút mình
sẽ tạo bằng file Java:
4/ Và trong Package chính các bạn tạo các file đ ể vẽ và sử lý các nút (dot) đ ồng th ời
cũng sinh ra các Log để theo dõi trong View Debug:
+ Dot.java:
package com.dac.drag.drop.demo;
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.util.AttributeSet;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
public class Dot extends View
implements View.OnDragListener
{
private static final int DEFAULT_RADIUS = 20;
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;
Lập trình Android – http://laptrinhdidong.vn Page 3
- Trung tâm Tin học – ĐH KHTN
private int mRadius = DEFAULT_RADIUS;
private boolean inDrag;
public Dot(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray myAttrs = context.obtainStyledAttributes(attrs,
R.styleable.Dot);
final int numAttrs = myAttrs.getIndexCount();
for (int i = 0; i < numAttrs; i++) {
int attr = myAttrs.getIndex(i);
switch (attr) {
case R.styleable.Dot_radius:
mRadius = myAttrs.getDimensionPixelSize(attr, DEFAULT_RADIUS);
break;
case R.styleable.Dot_color:
mColor = myAttrs.getColor(attr, DEFAULT_COLOR);
break;
}
}
myAttrs.recycle();
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();
Lập trình Android – http://laptrinhdidong.vn Page 4
- Trung tâm Tin học – ĐH KHTN
setMeasuredDimension(size, size);
}
public boolean onDrag(View v, DragEvent event) {
String dotTAG = (String) getTag();
if(event.getLocalState() != this) {
Log.v(dotTAG, "This drag event is not for us");
return false;
}
boolean result = true;
int action = event.getAction();
float x = event.getX();
float y = event.getY();
switch(action) {
case DragEvent.ACTION_DRAG_STARTED:
Log.v(dotTAG, "drag started. X: " + x + ", Y: " + y);
inDrag = true;
break;
case DragEvent.ACTION_DRAG_LOCATION:
Log.v(dotTAG, "drag proceeding... At: " + x + ", " + y);
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.v(dotTAG, "drag entered. At: " + x + ", " + y);
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.v(dotTAG, "drag exited. At: " + x + ", " + y);
break;
case DragEvent.ACTION_DROP:
Log.v(dotTAG, "drag dropped. At: " + x + ", " + y);
result = false;
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.v(dotTAG, "drag ended. Success? " + event.getResult());
inDrag = false;
break;
default:
Log.v(dotTAG, "some other drag action: " + action);
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();
Lập trình Android – http://laptrinhdidong.vn Page 5
- Trung tâm Tin học – ĐH KHTN
}
}
+ Palette.java :
package com.dac.drag.drop.demo;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Palette extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle icicle) {
View v = inflater.inflate(R.layout.palette, container, false);
return v;
}
}
+ DropZone.java :
package com.dac.drag.drop.demo;
import android.animation.ObjectAnimator;
import android.app.Fragment;
import android.content.ClipData;
import android.os.Bundle;
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;
public class DropZone extends Fragment {
Lập trình Android – http://laptrinhdidong.vn Page 6
- Trung tâm Tin học – ĐH KHTN
private View dropTarget;
private TextView dropMessage;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle icicle)
{
View v = inflater.inflate(R.layout.dropzone, 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:
Log.v(DROPTAG, "drag started in dropTarget");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.v(DROPTAG, "drag entered dropTarget");
anim = ObjectAnimator.ofFloat((Object)v, "alpha",
1f, 0.5f);
anim.setInterpolator(new CycleInterpolator(40));
anim.setDuration(30*1000); // 30 seconds
anim.start();
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.v(DROPTAG, "drag exited dropTarget");
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();
Lập trình Android – http://laptrinhdidong.vn Page 7
- Trung tâm Tin học – ĐH KHTN
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;
}
}
+ MainActivity.java :
package com.dac.drag.drop.demo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Khi debug, ngoài việc các bạn kéo thả các nút vào ô vuông thì b ạn còn có th ể xem
hoạt động đồng thời của việc drop, drap thông qua View Debug:
Lập trình Android – http://laptrinhdidong.vn Page 8
- Trung tâm Tin học – ĐH KHTN
Mọi ý kiến đóng góp các bạn vui lòng gữi bài viết về forum:
http://forum.laptrinhdidong.vn . Rất mong nhận được sự phản hồi từ các bạn
Lập trình Android – http://laptrinhdidong.vn Page 9
nguon tai.lieu . vn