2013-01-12 163 views
3

我有這個「拖放」的東西。Android:拖放多個圖像

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

我建議您瞭解更多關於Android的知識,否則您將不斷受挫。首先找出爲什麼這行錯誤,'class touchListener擴展了Activity實現的OnTouchListener',它不應該擴展Activity。 – Simon

+0

嗨西蒙。謝謝您的回答。我意識到那個OnTouchListener的事情。如果您看到代碼,我在代碼的最後部分在內部類中實現了OnTouchListener。我現在的問題是,我只能移動一張圖片,而且我需要移動5張圖片。謝謝。 –

+0

我不想聽起來很粗魯,但它聽起來像「我不知道如何正確地做到這一點,有人只是修復我的代碼。有很多問題,除非你瞭解基礎知識,你期望如何另一個例子,這行代碼是做什麼的?'candiesOut [1] .setOnTouchListener(new touchListener())' – Simon

回答

0

你可能想看看這個庫和實例; https://github.com/2dwarfs/MultiTouchControllerTutorial

它將幫助您創建可拖動和可捏合的圖像,並且可以像添加Drawable一樣簡單地添加儘可能多的圖像。

你可以直接使用它,調整它只能拖動,或從中吸取一些教訓和靈感。