在Android中我們可以通過對ImageView的ontouch事件進行監聽,然後重新layout imageview來拖動它。這種情況下源ImageView也會跟著動。我們如果想實現源ImageView不動而有拖拽效果可以結合OnTouchListener 和 OnDragListener。
、 我們對ImageView設定OnTouchListener 事件,對這個ImageView要拖到的目的地區設定OnDragListener事件。下面貼下代碼。
/** * Touch 事件 */final OnTouchListener movingEventListener = new OnTouchListener() {private int downX;private int downY;public boolean onTouch(View view, MotionEvent motionEvent) {int id = view.getId();if (Constant.isScanning&& (id == R.id.image_picture || id == R.id.image_file|| id == R.id.image_music || id == R.id.image_video)) {Toast.makeText(Constant.applicationContext, "正在掃描SDCard,請稍後。",Toast.LENGTH_SHORT).show();return false;}switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:downX = (int) motionEvent.getX();downY = (int) motionEvent.getY();break;case MotionEvent.ACTION_MOVE:int moveX = (int) motionEvent.getX();int moveY = (int) motionEvent.getY();int deltaY = moveY - downY;if (Math.abs(deltaY) > 20) {ClipData data = ClipData.newPlainText("", "");DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);view.startDrag(data, shadowBuilder, view, 0);return true;}break;}return false;}};
picture.setOnTouchListener(movingEventListener);
picture 是要拖拽的ImageView的執行個體。對其設定onTouchListener監聽事件,如果deltaY的絕對值大於20我們會觸發它的拖拽動作。
/** * 拖拽事件 * * @Package com.example.privatecloud * @ClassName: DragListener * @date 2013-8-1 上午11:04:48 */class DragListener implements OnDragListener {Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);Drawable normalShape = getResources().getDrawable(R.drawable.shape);@Overridepublic boolean onDrag(View v, DragEvent event) {int action = event.getAction();switch (event.getAction()) {case DragEvent.ACTION_DRAG_STARTED:// Do nothingbreak;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 ViewGroupView view = (View) event.getLocalState();// ViewGroup owner = (ViewGroup) view.getParent();// owner.removeView(view);// RelativeLayout container = (RelativeLayout) v;// container.addView(view);startTransmiss(view);view.setVisibility(View.VISIBLE);break;case DragEvent.ACTION_DRAG_ENDED:v.setBackgroundDrawable(normalShape);default:break;}return true;}}
serverLayout.setOnDragListener(new DragListener());
serverLayout就是我們的ImageView要拖拽的目的地區,在ACTION_DROP這個事件時,我們可以執行拖拽成功的操作了。