Android-在应用中使用拖拽教程

翻译 2016年05月31日 14:36:43

Android-在应用中使用拖拽教程

Lars Vogel

Version 1.3
Copyright © 2012-2014 vogella GmbH
21.11.2014
在Android中使用拖拽

这个教程描述在Android中如何使用拖拽


目录

  1. Android拖拽
    1.1在Android中使用拖拽
    1.2允许view拖拽
    1.3定义拖动目标
  2. 练习:拖拽
    2.1这个练习的目标
    2.2创建项目
    2.3创建 xml Drawable
    2.4Activity和layout

1.Android拖拽

1.1在Android中使用拖拽
Android4.0支持在view或viewGroup上的拖拽view
1.2允许view拖拉
你注册一个onTouchListener或LongClickListener在被拖拽的view上使其能够拖拽
View的startDrag方法开始一个拖拽操作。在这个方法你也可以通过ClipData的实例指定按下拖拽目标数据
你也可以通过DragShadowBuilder实例的startDrag方法。这个对象指定图像用于拖拽操作。例如你可以直接地通过View,在拖拽操作中展现一个view的图像
下面的例子演示在TouchListener下的拖拉操作设置

    // Assign the touch listener to your view which you want to move
            findViewById(R.id.myimage1).setOnTouchListener(new MyTouchListener());

    // This defines your touch listener
    private final class MyTouchListener implements OnTouchListener {
      public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
  ClipData data = ClipData.newPlainText("", "");
  DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
  view.startDrag(data, shadowBuilder, view, 0);
  view.setVisibility(View.INVISIBLE);
  return true;
} else {
return false;
}
     }
    } 

1.3 定义拖拉目标

能够拖拽的view得到一个onDragListener分配的实例。在这个拖拽监听,你接收预定义的拖拽相关事件回调

  • DragEvent.ACTION_DRAG_STARTED
  • DragEvent.ACTION_DRAG_ENTERED
  • DragEvent.ACTION_DRAG_EXITED
  • DragEvent.ACTION_DROP
  • DragEvent.ACTION_DRAG_ENDED
    一个有onDragListener的view是可以拖拽的区域,通过setonDragListener得到一个分配onDragListener

     findViewById(R.id.bottomright).setOnDragListener(new MyDragListener());
    
    class MyDragListener implements OnDragListener {
      Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
      Drawable normalShape = getResources().getDrawable(R.drawable.shape);
    
      @Override
      public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
    // do nothing
      break;
      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 ViewGroup
        View view = (View) event.getLocalState();
                ViewGroup owner = (ViewGroup) view.getParent();
        owner.removeView(view);
        LinearLayout container = (LinearLayout) v;
        container.addView(view);
        view.setVisibility(View.VISIBLE);
        break;
      case DragEvent.ACTION_DRAG_ENDED:
        v.setBackgroundDrawable(normalShape);
        default:
        break;
      }
      return true;
    }
    }
    

练习:拖拽

2.1练习目标
在这个练习中,你创建多个允许他们之间拖动views的Viewgroup
2.2创建项目
创建一个新的名为com.vogella.android.draganddrop的Android 项目和一个叫DragActivity的Activity
创建 XMLDrawables
在这个练习你能够使用 XML Drawable
在这个部分你在res/drawable文件夹创建多个XML Drawable
创建下面shape.xml文件在这个文件夹

    <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<stroke
    android:width="2dp"
    android:color="#FFFFFFFF" />

<gradient
    android:angle="225"
    android:endColor="#DD2ECCFA"
    android:startColor="#DD000000" />

<corners
    android:bottomLeftRadius="7dp"
    android:bottomRightRadius="7dp"
    android:topLeftRadius="7dp"
    android:topRightRadius="7dp" />

  </shape>

也创建下面的shape——droptarget.xml文件

<?xml version="1.0" encoding="UTF-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<stroke
    android:width="2dp"
    android:color="#FFFF0000" />

<gradient
    android:angle="225"
    android:endColor="#DD2ECCFA"
    android:startColor="#DD000000" />

<corners
    android:bottomLeftRadius="7dp"
    android:bottomRightRadius="7dp"
    android:topLeftRadius="7dp"
    android:topRightRadius="7dp" />

  </shape>

2.4Activity和layout
用下面的代码的修改Activity的layout

        <?xml version="1.0" encoding="utf-8"?>
    <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="2"
android:columnWidth="320dp"
android:orientation="vertical"
android:rowCount="2"
android:stretchMode="columnWidth" >

<LinearLayout
    android:id="@+id/topleft"
    android:layout_width="160dp"
    android:layout_height="160dp"
    android:layout_row="0"
    android:background="@drawable/shape" >

    <ImageView
        android:id="@+id/myimage1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>

<LinearLayout
    android:id="@+id/topright"
    android:layout_width="160dp"
    android:layout_height="160dp"
    android:background="@drawable/shape" >

    <ImageView
        android:id="@+id/myimage2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>

<LinearLayout
    android:id="@+id/bottomleft"
    android:layout_width="160dp"
    android:layout_height="160dp"
    android:background="@drawable/shape" >

    <ImageView
        android:id="@+id/myimage3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>

<LinearLayout
    android:id="@+id/bottomright"
    android:layout_width="160dp"
    android:layout_height="160dp"
    android:background="@drawable/shape" >

    <ImageView
        android:id="@+id/myimage4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>

</GridLayout>

用下面的代码修改你的activity

        package com.vogella.android.draganddrop;

import android.app.Activity;
import android.content.ClipData;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.DragShadowBuilder;
import android.view.View.OnDragListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;

public class DragActivity extends Activity {

/** Called when the activity is first created. */

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.myimage1).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage2).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage3).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage4).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.topleft).setOnDragListener(new MyDragListener());
    findViewById(R.id.topright).setOnDragListener(new MyDragListener());
    findViewById(R.id.bottomleft).setOnDragListener(new MyDragListener());
    findViewById(R.id.bottomright).setOnDragListener(new MyDragListener());

  }

  private final class MyTouchListener implements OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
      if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        ClipData data = ClipData.newPlainText("", "");
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);
        view.setVisibility(View.INVISIBLE);
        return true;
      } else {
        return false;
      }
    }
  }

  class MyDragListener implements OnDragListener {
    Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
    Drawable normalShape = getResources().getDrawable(R.drawable.shape);

@Override
public boolean onDrag(View v, DragEvent event) {
  int action = event.getAction();
  switch (event.getAction()) {
  case DragEvent.ACTION_DRAG_STARTED:
    // do nothing
    break;
  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 ViewGroup
    View view = (View) event.getLocalState();
    ViewGroup owner = (ViewGroup) view.getParent();
    owner.removeView(view);
    LinearLayout container = (LinearLayout) v;
    container.addView(view);
    view.setVisibility(View.VISIBLE);
    break;
  case DragEvent.ACTION_DRAG_ENDED:
    v.setBackgroundDrawable(normalShape);
  default:
    break;
  }
  return true;
}
  }
} 

如果你开启这个activity,你应该能够拖动ImageView到其他容
这里写图片描述
原文地址

Android View 拖拽 移动 碰撞

1. 被拖动view      view.setOnLongClickListener(new View.OnLongClickListener() { @Override publ...
  • u011840744
  • u011840744
  • 2016年07月18日 15:31
  • 2244

Android控件拖动的实现

这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是只...
  • aomandeshangxiao
  • aomandeshangxiao
  • 2012年03月31日 15:21
  • 30872

Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换

在Android开发中,我们常常用到ListView和GridView,而有的时候系统的ListView,GridView并不能满足我们的需求,所以我们需要自己定义一个ListView或者GridVi...
  • xiaanming
  • xiaanming
  • 2014年01月06日 08:57
  • 87843

Android-满屏幕拖动的控件

今天做个有意思的效果吧,控件的拖拽,先看一下模拟器运行: 也就是,用户可以随心所欲的拖动控件,布局文件很简单就是一个Button控件: xml version="1.0...
  • SuperCopa
  • SuperCopa
  • 2016年08月22日 11:12
  • 3331

Android最简单的实现View拖拽跟随手指移动效果

今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,Android 4.0 后系统已经提供了更简单...
  • wei1583812
  • wei1583812
  • 2017年08月21日 12:36
  • 1166

【优才原创】Android的拖放机制

优才网 【优才原创】Android的拖放机制 2016-04-18 优才学院 优才网 一、拖放机制概述 ² 拖放操作是手指触...
  • bianbiancheng
  • bianbiancheng
  • 2016年04月18日 11:33
  • 2021

android实现文件的拖拽效果

在Android 3.0 以前的版本,拖放一个试图需要使用触摸(Touch)事件,而且拖动到指定的区域还需要判断坐标是否落到这一区域,很麻烦。从Android 3.0以后,Android SDK直接支...
  • JJZ_bobo
  • JJZ_bobo
  • 2016年08月16日 22:49
  • 2199

Android控件拖动的实现

这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图 这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载...
  • wangjia55
  • wangjia55
  • 2012年04月13日 17:03
  • 19068

Android 在你的app实现拖放

1. Android 拖放(Drag And Drop) 1.1 在Android实现拖放 随着 Android 4.0的到来View 或ViewGroup已经可以实现拖放功能 1.2 ...
  • sd19871122
  • sd19871122
  • 2015年11月06日 13:11
  • 649

安卓UI控件拖拽的几种方法

上一篇简单的讲解了安卓listview控件的一些简单的用法,这一次我们按照群英传的思路看一看安卓UI控件拖拽的实现方法。 安卓控件的拖拽(这里用词可能不太专业)可归纳为一下几个动作:1.普通拖拽,改变...
  • u010921701
  • u010921701
  • 2016年05月10日 16:27
  • 1716
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-在应用中使用拖拽教程
举报原因:
原因补充:

(最多只允许输入30个字)