安卓:拖放多张图片

3
我有一个“拖放”功能。
基本上,我们正在制作一个原型,让用户(孩子)将糖果拖放到罐子里。下面的代码仅适用于一个糖果(1张图片),第二张图片根本不会动。我不知道为什么。
非常感谢您提供任何答案,并希望您能解释一下,因为我在这个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>

我建议你学习更多关于Android,否则你会经常感到沮丧。首先要弄清楚为什么这行代码是错误的:class touchListener extends Activity implements OnTouchListener,它不应该继承Activity。 - Simon
嗨,Simon。谢谢你的回答。我知道那个OnTouchListener的东西。如果你看代码,我在代码末尾实现了一个内部类中的OnTouchListener。我现在遇到的问题是我只能移动一张图片,而我需要移动大约5张图片。谢谢。 - Roberto Salim
我不想听起来粗鲁,但这听起来像是“我懒得学习如何正确地做这件事,有人帮我修复我的代码。”除非你学习基础知识,否则会有多个问题,你如何期望完成一个应用程序呢?另一个例子,这行代码是做什么的?candiesOut[1].setOnTouchListener(new touchListener()) - Simon
1个回答

0
你可能想要查看这个库和示例; https://github.com/2dwarfs/MultiTouchControllerTutorial 它将帮助您创建一个可拖动和缩放的图像,您可以像添加Drawable一样简单地添加任意数量。
您可以直接使用它,将其调整为仅可拖动,或从中学习并获得灵感。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接