在android中拖放图像

我正在一个单词争夺游戏,允许用户将图像移动到图像..如果图像不匹配,那么它应该回到原来的位置,从拖动的地方。我写了一个示例代码,以移动图像,但这里的问题是,如果我移动一个图像的邻居图像也开始移动..这里是示例代码。

/** Touchmoveimage.java*/ package com.examples.Touchmoveimage; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.LinearLayout.LayoutParams; public class Touchmoveimage extends Activity implements OnTouchListener{ int windowwidth; int windowheight; private LayoutParams layoutParams ; private LayoutParams layoutParams1 ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); windowwidth = getWindowManager().getDefaultDisplay().getWidth(); windowheight = getWindowManager().getDefaultDisplay().getHeight(); ImageView ball= (ImageView)findViewById(R.id.ball); ball.setOnTouchListener(this); ImageView ball1 = (ImageView)findViewById(R.id.ball1); ball1.setOnTouchListener(this); } public boolean onTouch(View v,MotionEvent event) { switch(v.getId()) { case R.id.ball: ImageView ball= (ImageView)findViewById(R.id.ball); layoutParams = (LayoutParams) ball.getLayoutParams(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int)event.getRawX(); int y_cord = (int)event.getRawY(); if(x_cord>windowwidth){x_cord=windowwidth;} if(y_cord>windowheight){y_cord=windowheight;} layoutParams.leftMargin = x_cord -25; layoutParams.topMargin = y_cord - 75; ball.setLayoutParams(layoutParams); break; default : break; } case R.id.ball1: ImageView ball1= (ImageView)findViewById(R.id.ball1); layoutParams1 = (LayoutParams) ball1.getLayoutParams(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int)event.getRawX(); int y_cord = (int)event.getRawY(); if(x_cord>windowwidth){x_cord=windowwidth;} if(y_cord>windowheight){y_cord=windowheight;} layoutParams1.leftMargin = x_cord -25; layoutParams1.topMargin = y_cord - 75; ball1.setLayoutParams(layoutParams1); break; default : break; } } return true;} } 
  <!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="50sp" android:layout_height="50sp" android:id="@+id/ball" android:src="@drawable/ball"> </ImageView> <ImageView android:layout_y="30dip" android:layout_x="118dip" android:layout_width="50sp" android:layout_height="50sp" android:id="@+id/ball1" android:src="@drawable/ball1"> </ImageView> </LinearLayout> 

任何人plz帮助我出来..尽一切可能的事情来解决它..

Solutions Collecting From Web of "在android中拖放图像"

你需要确保事件发生在给定的球。 即使您在图像对象之外触摸,onTouch事件也会被声明。 所以你可以做的是检查你已经closures的ACTION_DOWN阶段,以确保触摸在对象的边界。 然后你可以设置一个标志来告诉系统哪个球被移动。 我会让你做这个编码,但希望这会让你知道该怎么做。

你可以从这个代码中得到一个想法,这将是非常有用的…我也在这个概念工作。

 package com.example.drag; import android.app.*; import android.graphics.*; import android.os.*; import android.util.Log; import android.view.*; import android.view.View.*; import android.widget.*; import android.widget.AbsoluteLayout.LayoutParams; public class MainActivity extends Activity implements OnTouchListener { // The letter that the user drags. // The letter outline that the user is supposed to drag letterView to. private AbsoluteLayout mainLayout; TextView letterView; TextView emptyLetterView; TextView letter_E,letter_I,letter_O,letter_U; TextView letter_C,letter_T; int status=0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainLayout = (AbsoluteLayout) findViewById(R.id.absLayout); mainLayout.setOnTouchListener(this); letterView = (TextView) findViewById(R.id.imageView); letterView.setOnTouchListener(this); emptyLetterView = (TextView) findViewById(R.id.textView1); letter_E= (TextView) findViewById(R.id.text_E); letter_I= (TextView) findViewById(R.id.text_I); letter_O= (TextView) findViewById(R.id.text_O); letter_U= (TextView) findViewById(R.id.text_U); letter_C= (TextView) findViewById(R.id.text_C); letter_T= (TextView) findViewById(R.id.text_T); letter_I.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub status=2; return false; } }); letter_E.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub status=1; Log.i("ImageStatus",""+status); return false; } }); AbsoluteLayout abl=(AbsoluteLayout)findViewById(R.id.absLayout); abl.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Log.i("touch",""+event); if(status==1) // any event from down and move { LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,(int)event.getX()-letter_E.getWidth()/2,(int)event.getY()-letter_E.getHeight()/2); letter_E.setLayoutParams(lp); } else if (status==2) { LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,(int)event.getX()-letter_E.getWidth()/2,(int)event.getY()-letter_E.getHeight()/2); letter_I.setLayoutParams(lp); } if(event.getAction()==MotionEvent.ACTION_UP){ status=0; letter_E.setBackgroundColor(Color.TRANSPARENT); letter_I.setBackgroundColor(Color.TRANSPARENT); } return true; } }); Typeface type= Typeface.createFromAsset(getAssets(), "AlphaBalloon.ttf"); letterView.setTypeface(type); emptyLetterView.setTypeface(type); letter_E.setTypeface(type); letter_I.setTypeface(type); letter_O.setTypeface(type); letter_U.setTypeface(type); letter_C.setTypeface(type); letter_T.setTypeface(type); } private boolean dragging = false; private Rect hitRect = new Rect(); @Override /** * NOTE: Had significant problems when I tried to react to ACTION_MOVE on letterView. Kept getting alternating (X,Y) * locations of the motion events, which caused the letter to flicker and move back and forth. The only solution I could * find was to determine when the user had touched down on the letter, then process moves in the ACTION_MOVE * associated with the mainLayout. */ public boolean onTouch(View v, MotionEvent event) { boolean eventConsumed = true; int x = (int)event.getX(); int y = (int)event.getY(); int action = event.getAction(); if (action == MotionEvent.ACTION_DOWN) { if (v == letterView) { dragging = true; eventConsumed = false; } } else if (action == MotionEvent.ACTION_UP) { if (dragging) { emptyLetterView.getHitRect(hitRect); if (hitRect.contains(x, y)) setSameAbsoluteLocation(letterView, emptyLetterView); } dragging = false; eventConsumed = false; } else if (action == MotionEvent.ACTION_MOVE) { if (v != letterView) { if (dragging) { setAbsoluteLocationCentered(letterView, x, y); } } } return eventConsumed; } private void setSameAbsoluteLocation(View v1, View v2) { AbsoluteLayout.LayoutParams alp2 = (AbsoluteLayout.LayoutParams) v2.getLayoutParams(); setAbsoluteLocation(v1, alp2.x, alp2.y); letterView.setVisibility(View.GONE); emptyLetterView.setText("A"); emptyLetterView.setTextColor(Color.BLACK); Toast.makeText(getApplicationContext(), "C for Cat", Toast.LENGTH_SHORT).show(); } 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); } } 

而XML是…..

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/LLayout"> <AbsoluteLayout android:id="@+id/absLayout" android:layout_width="fill_parent" android:layout_height="300dp" android:layout_alignParentBottom="true" > <TextView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="10dp" android:layout_y="-3dp" android:text="A" android:textSize="80dp" /> <TextView android:id="@+id/text_" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="73dp" android:layout_y="-3dp" android:text="E" android:textSize="80dp"/> <TextView android:id="@+id/text_I" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="134dp" android:layout_y="-4dp" android:text="I" android:textSize="80dp" /> <TextView android:id="@+id/text_O" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="196dp" android:layout_y="-4dp" android:text="O" android:textSize="80dp" /> <TextView android:id="@+id/text_U" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="260dp" android:layout_y="-4dp" android:text="U" android:textSize="80dp" /> <TextView android:id="@+id/text_T" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="196dp" android:layout_y="131dp" android:text="T" android:textSize="80dp" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="120dp" android:layout_y="128dp" android:text="A" android:textColor="#ffff9f" android:textSize="80dp" /> <TextView android:id="@+id/text_C" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="45dp" android:layout_y="129dp" android:text="C" android:textSize="80dp" /> </AbsoluteLayout> <AbsoluteLayout android:id="@+id/absLayoutNew" android:layout_width="fill_parent" android:layout_height="wrap_content"> </AbsoluteLayout> <TextView android:id="@+id/text_E" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="H" android:textSize="80dp" /> 

傻了我……仔细看后,我意识到这是你的根本做法是错误的。 你想在球的ImageView上设置onTouchListener。 我实际上只是创build一个球对象,你一定想在以后做一些事情。 原始坐标应该在任何地方都能正常工作,所以…给我一个机会,让我知道它是如何工作的。

LinearLayout的问题在于它的视图是水平的或垂直的。 只需将您的布局更改为FrameLayout或弃用的AbsoluteLayout。 那对你来说工作得很好。

我试图写一个类似的程序,并有同样的问题。 在我看来,在整个程序中只有一个“onTouchListener”是可能的。 我使用FrameLayout,当我触摸屏幕,我想要一个新球出现。 它在我定义“FrameLayout.setOnTouchListener”

如果我触摸现有的球,我想拖动它的地方。 它在“Ball.setOnTouchListener”被定义时起作用。

但是,当我使用“setOnTouchListeners”,而不是只有其中之一的作品。

所以我认为Android只能用一个“setOnTouchListener”工作,而且你必须以某种方式(我不知道如何)检查dynamic创build的球被触及并处理它。