簡體   English   中英

Android:拖放多個圖像

[英]Android: Drag and Drop multiple images

我有這個“拖放”的東西。

所以基本上我們正在制作一個原型讓用戶(孩子)將糖果拖放到罐子里。 下面的代碼僅適用於一個糖果(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>

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

它將幫助您創建一個可拖動和可追蹤的圖像,您可以添加任意數量的圖像,就像添加Drawable一樣簡單。

您可以按原樣使用它,將其調整為僅可拖動,或從中吸取一些教訓和靈感。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM