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控件拖动的实现

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

Android控件拖动的实现

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

Android Launcher3修改行数,列数,布局等;隐藏HostSeat,使用户无法拖拽应用图标到Hotseat

修改Launcher的行列数比较简单,在DeviceProfile方法中的构造方法中,可以修改行数,列数等。但是更严格的话需要到DynamicGrid方法中,调用DeviceProfile该方法时根据...
  • cgt_cgt
  • cgt_cgt
  • 2017年07月28日 15:28
  • 451

Android应用中实现拖拽排序及添加阴影的方式

--- by Anwei.shi 背景介绍: Android 应用开发中避免不了对容器中的各个Item的进行拖拽排序等操作,比如锤子手机中著名的OneStep功能(拖拽),以及Andr...

Android应用开发之实现图片的拖拽显示

OnTouchListener       OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名...

使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用

今天我们将开发一个简单的叫upload center的图片上传程序,允许用户使用拖拽方式来上传电脑上的图片,使用现在浏览器支持新的HTML5 API。 图片将会有一个预览和进度条,都由客户端控制。...
  • roc1010
  • roc1010
  • 2012年11月01日 13:38
  • 1375

Android 使用变形矩阵实现可以拖拽,缩放,旋转的图像

上篇博文介绍了变形矩阵的一些用法,所以这篇博文就结合变形矩阵来实现一个可以拖拽、缩放、旋转的图像吧。首先,我们就继承ImageView来实现我们的自定义View。...

Android使用贝塞尔线高仿QQ聊天消息气泡的拖拽效果

Android高仿QQ消息气泡拖拽效果

Android——RecyclerView——使用ItemDragHelper来实现酷炫拖拽效果

参考资料参考资料1 参考资料2 参考资料3【推荐】背景介绍列表控件可以说是我们绝大部分App中都会使用的,为了提升交互乐趣,我们经常需要在列表中加入拖拽、滑动等操作,本篇我将介绍使用ItemDra...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-在应用中使用拖拽教程
举报原因:
原因补充:

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