java - Android:拖放多个图像

标签 java android drag-and-drop

我有这个“拖放”的东西。

所以基本上我们正在制作一个原型(prototype),让用户( child )将糖果拖放到 jar 里。 下面的代码仅适用于一颗糖果(一张图片),第二张图片根本不会移动。我不知道为什么。

任何答案都将不胜感激,我希望你能解释一下,因为我是这个 android 开发的新手。谢谢。

这些是我研究了一段时间的代码

package com.example.mathventure;

import com.example.mathventure.R.drawable;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Rect;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AbsoluteLayout;
import android.widget.ImageView;

@SuppressLint("NewApi")
public class AddTutActivity extends Activity {
    private static int candyInJar = 3;
    private int candyOutJar = 2;
    private int totalCandy;
    //private String candyId;
    private ImageView[] candies = new ImageView[11];
    private ImageView[] candiesOut = new ImageView[candyOutJar];
    private AbsoluteLayout tutLayout;
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_tut);

        tutLayout = (AbsoluteLayout) findViewById(R.id.tutLayout);
        tutLayout.setOnTouchListener(new touchListener());
        candiesOut[0] = (ImageView) findViewById(R.id.candyOut1);
        candiesOut[1] = (ImageView) findViewById(R.id.candyOut2);
        candiesOut[0].setOnTouchListener(new touchListener());
        candiesOut[1].setOnTouchListener(new touchListener());




        totalCandy = candyInJar + candyOutJar;
        for(int i=0;i<candies.length;i++){
            candies[i] = new ImageView(this);
        }
        candies[0].setBackgroundResource(R.drawable.candy_jar_0);
        candies[1].setBackgroundResource(R.drawable.candy_jar_1);
        candies[2].setBackgroundResource(R.drawable.candy_jar_2);
        candies[3].setBackgroundResource(R.drawable.candy_jar_3);
        candies[4].setBackgroundResource(R.drawable.candy_jar_4);
        candies[5].setBackgroundResource(R.drawable.candy_jar_5);
        candies[6].setBackgroundResource(R.drawable.candy_jar_6);
        candies[7].setBackgroundResource(R.drawable.candy_jar_7);
        candies[8].setBackgroundResource(R.drawable.candy_jar_8);
        candies[9].setBackgroundResource(R.drawable.candy_jar_9);
        candies[10].setBackgroundResource(R.drawable.candy_jar_10);

        candies[candyInJar] = (ImageView) findViewById(R.id.candyInJar);

    }

    private boolean dragging = false;
    private Rect hitRect = new Rect();


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_add_tut, menu);
        return true;
    }

    class touchListener extends Activity implements OnTouchListener{

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            boolean eventConsumed = true;
            int x = (int)event.getX();
            int y = (int)event.getY();
            int dragging = 0;
            int action = event.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                if (v == candiesOut[0]) {
                    dragging = 0;
                    eventConsumed = false;
                }
                if (v == candiesOut[1]){
                    dragging = 1;
                    eventConsumed = false;
                }
            } else if (action == MotionEvent.ACTION_UP) {

                if (dragging == 0) {
                    candies[candyInJar].getHitRect(hitRect);
                    if (hitRect.contains(x, y)){
                        candiesOut[0].setImageDrawable(null);
                        candies[candyInJar].setImageResource(drawable.candy_jar_4);
                    }
                }
                else if(dragging == 1){
                    candies[candyInJar].getHitRect(hitRect);
                    if (hitRect.contains(x, y)){
                        candiesOut[1].setImageDrawable(null);
                        candies[candyInJar].setImageResource(drawable.candy_jar_5);
                    }
                }
                eventConsumed = false;

            } else if (action == MotionEvent.ACTION_MOVE) {
                if (v != candiesOut[0] && v != candiesOut[1]) {
                    if (dragging != 1) {
                        setAbsoluteLocationCentered(candiesOut[dragging], x, y);
                    }
                }
            }

            return eventConsumed;
        }


        private void setAbsoluteLocationCentered(View v, int x, int y) {
            setAbsoluteLocation(v, x - v.getWidth() / 2, y - v.getHeight() / 2);
        }


        private void setAbsoluteLocation(View v, int x, int y) {
            AbsoluteLayout.LayoutParams alp = (AbsoluteLayout.LayoutParams) v.getLayoutParams();
            alp.x = x;
            alp.y = y;
            v.setLayoutParams(alp);
        }

        private void setSameAbsoluteLocation(View v1, View v2) {
            AbsoluteLayout.LayoutParams alp2 = (AbsoluteLayout.LayoutParams) v2.getLayoutParams();
            setAbsoluteLocation(v1, alp2.x, alp2.y);
        }
    }


}

这个是针对 xml 的:

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AddTutActivity" 
    android:id="@+id/tutLayout">


<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="116dp"
    android:fontFamily="123Marker"
    android:text="3 candies + 2 candies = ?"
    android:textColor="@android:color/black"
    android:textSize="50sp" />

<TextView
    android:id="@+id/TextView01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="123Marker"
    android:text="Below is a sample question on addition. Now, you need to move the 2 candies you wanted to add into the candy jar."
    android:textColor="@android:color/black"
    android:textSize="25sp" 
    android:background="#FF3300"/>

<ImageView
    android:id="@+id/candyInJar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="178dp"
    android:layout_x="149dp"
    android:layout_y="167dp"
    android:src="@drawable/candy_jar_3" />

<ImageView
    android:id="@+id/candyOut1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="94dp"
    android:layout_x="489dp"
    android:layout_y="347dp"
    android:src="@drawable/candy" />

<ImageView
    android:id="@+id/candyOut2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="544dp"
    android:layout_y="346dp"
    android:src="@drawable/candy" />

</AbsoluteLayout>

最佳答案

您可能想查看此库和示例; https://github.com/2dwarfs/MultiTouchControllerTutorial

它将帮助您创建一个可拖动和可收缩的图像,并且您可以添加任意数量的图像,就像添加一个 Drawable 一样简单。

您可以按原样使用它,将它调整为只能拖动,或者从中吸取一些教训和灵感。

关于java - Android:拖放多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294945/

相关文章:

javascript - 如何更改复制元素的 ID

java - ArrayList 和读取文件的问题

java - 删除空格和大写首字母

java - 改造响应方法从谷歌地图 API 解析 JSON 不起作用

jquery-ui - Jquery UI 中的 Jquery Dragstart 和 Dragend 事件

c# - WinForms 图表 : How can I identify a DataPoint within the DragDrop event?

Java android room 从db获取HashMap

java - 使用 Spring JdbcTemplate 插入数千行

android - 是否有任何机制可以从命令行而不是通过网络浏览器将 .AAB 更新上传到 Google Play?

android - 静态设置 onClickListener,内存泄漏?