如何将一个ImageView拖放到另一个ImageView上? [英] How to drag and drop an ImageView onto another ImageView?

查看:61
本文介绍了如何将一个ImageView拖放到另一个ImageView上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Android相当陌生,但已经成功地掌握了一些零碎的东西。

我现在尝试实现的是一个简单的拖放活动,它允许用户:

  • 将一个形状&q;ImageView&q;拖放到另一个形状&q;ImageView&q;上。
  • 如果镜像:
    匹配-它应该替换拖放到其上的图像,
    如果不是,它应该会迅速恢复到原来的位置。

我知道这意味着在我的Drop活动中创建一个如果/否则挡路,但在浏览了几个很多教程之后,我无法拼凑出我需要的东西。我目前没有足够的Java知识来完成这项工作。

目前我的布局包含6个ImageViews,其中3个是静电,3个可以在屏幕上移动并放置在布局上,但不能放在ImageViews上。

我想这是因为我按照我的布局而不是ImageViews设计了DragListener,但是我有点迷路了,有人能帮我吗?

以下是我的代码:

DragandDrop.java    

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;
import android.app.Activity;

public class DragandDrop extends Activity implements OnTouchListener, OnDragListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.draganddrop);
    findViewById(R.id.squareImage).setOnTouchListener(this);
    findViewById(R.id.circleImage).setOnTouchListener(this);
    findViewById(R.id.triangleImage).setOnTouchListener(this);
    findViewById(R.id.top_container).setOnDragListener(this);
    findViewById(R.id.bottom_container).setOnDragListener(this);
    findViewById(R.id.squareImage1).setOnDragListener(this);
    findViewById(R.id.circleImage1).setOnDragListener(this);
    findViewById(R.id.triangleImage1).setOnDragListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent e) {
    if (e.getAction() == MotionEvent.ACTION_DOWN) {
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
        v.startDrag(null, shadowBuilder, v, 0);
        v.setVisibility(View.INVISIBLE);
        return true;
    } else {
        return false;
    }
}

@Override
public boolean onDrag(View v, DragEvent e) {
    if (e.getAction()==DragEvent.ACTION_DROP) {
        View view = (View) e.getLocalState();
        ViewGroup from = (ViewGroup) view.getParent();
        from.removeView(view);
        LinearLayout to = (LinearLayout) v;
        to.addView(view);
        view.setVisibility(View.VISIBLE);
    }
    return true;
}

}

draganddrop.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".draganddrop"
android:background="@drawable/dragshapes"
android:orientation="vertical"
android:id="@+id/dropLayout">


<LinearLayout
    android:id="@+id/top_container"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="@android:color/transparent"
    android:orientation="horizontal"
    android:gravity="center">

    <ImageView
        android:contentDescription="@string/square_text_content"
        android:id="@+id/squareImage1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragsquare1" />

    <ImageView
        android:contentDescription="@string/circle_text_content"
        android:id="@+id/circleImage1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragcircle1" />

    <ImageView
        android:contentDescription="@string/triangle_text_content"
        android:id="@+id/triangleImage1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragtriangle1" />



</LinearLayout>

<LinearLayout
    android:id="@+id/bottom_container"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="@android:color/transparent"
    android:orientation="horizontal"
    android:gravity="center">
    <ImageView
        android:contentDescription="@string/square_text_content"
        android:id="@+id/squareImage"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragsquare" />

    <ImageView
        android:contentDescription="@string/circle_text_content"
        android:id="@+id/circleImage"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragcircle" />

    <ImageView
        android:contentDescription="@string/triangle_text_content"
        android:id="@+id/triangleImage"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:src="@drawable/dragtriangle" />

</LinearLayout>

</LinearLayout>

推荐答案

删除容器的设置拖动侦听器

findViewById(R.id.top_container).setOnDragListener(this);  //Remove this
findViewById(R.id.bottom_container).setOnDragListener(this);  //Remove this
  • 检查拖放的图像视图是否与拖放的视图匹配。
    如果它们匹配:
    • 将拖放的ImageView的背景设置为拖放的背景。
      (其他维度与您的XML文件相同)

示例代码:

@Override
public boolean onDrag(View v, DragEvent e) {
    if (e.getAction()==DragEvent.ACTION_DROP) {
        View view = (View) e.getLocalState();
        
        if (view.getId()==R.id.squareImage1 && v.getId()==R.id.squareImage) {
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            v.setBackground(@drawable/dragsquare1);  //TODO: Change this pseudo code.
            return true;
        
        } else if(view.getId()==R.id.circleImage1 && v.getId()==R.id.circleImage) {
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            v.setBackground(@drawable/dragcircle1);  //TODO: Change this pseudo code.
            return true;

        } else if(view.getId()==R.id.triangleImage1 && v.getId()==R.id.triangleImage) {
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            v.setBackground(@drawable/dragtriangle1);  //TODO: Change this pseudo code.
            return true;

        } else {
            return false;
        }
    }
}

希望这能帮助您.
圣诞快乐

这篇关于如何将一个ImageView拖放到另一个ImageView上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆