我正在开发一个单词争夺游戏,它允许用户将图像移动到图像..如果图像不匹配,那么它应该回到它拖动它的原始位置。我写了一个示例代码移动图像,但这里的问题是,如果我移动一个图像,相邻的图像也开始移动..这是示例代码。
/** 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>
任何人都可以帮助我......尽一切可能来解决它..
答案 0 :(得分:1)
您需要确保事件发生在给定的球中。即使您在图像对象外部触摸,也会声明onTouch事件。因此,您可以做的是检查已阻止的ACTION_DOWN阶段,以确保触摸位于对象的边界内。然后你可以设置一个标志来告诉系统正在移动哪个球。我会让你做编码,但希望这会让你知道该怎么做。
答案 1 :(得分:1)
你可以从这段代码中获取一个想法,它将非常有用......我也在这个概念中工作。
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" />
答案 2 :(得分:0)
答案 3 :(得分:0)
问题在于LinearLayout,因为它的视图水平或垂直相互关联。只需将布局更改为FrameLayout或已弃用的AbsoluteLayout即可。这对你来说很合适。
答案 4 :(得分:0)
我正在尝试编写类似的程序并遇到同样的问题。在我看来,在整个程序中只能有一个“onTouchListener”。我使用FrameLayout,当我触摸屏幕时,我想要一个新球出现。它在我定义“FrameLayout.setOnTouchListener”
时有效如果我触摸现有球,我想将它拖到某个地方。它在定义“Ball.setOnTouchListener”时有效。
但是当我同时使用“setOnTouchListeners”时,只有其中一个可以工作。
所以我认为Android只能使用一个“setOnTouchListener”,在其中你必须以某种方式(我不知道如何)检查哪个动态创建的球被触摸并处理它。