我有一个GridView
附加的适配器。适配器在网格中填充图像。我已经设置setOnTouchLister
为GridView
,Activity
并且仅在适配器中实现。在适配器中,我有一个Integer[] imageIDs
包含所有已添加图像的资源ID的ID,它包含一个ArrayList<ImageSourceObject> imgObjsArr
扩展的ID
ImageView
和其他属性设置的ID 。
现在onTouch()
,我想将所选图像的图像更改为其他图像。这里是我的代码:在设置网格的适配器Activity
中onCreate
:
// Set Objects in Game View
gameView = (GridView) this.findViewById(R.id.game_gridView);
gameObjAdapter = new GameObjectsAdapter(this, R.id.game_gridView, null);
gameView.setAdapter(gameObjAdapter);
适配器:
public class GameObjectsAdapter extends BaseAdapter implements OnTouchListener {
super();
mContext = c;
this.layoutResourceId = layoutResourceId;
objects = data;
gridViewResAdap = (GridView) mContext.findViewById(this.layoutResourceId);
createObjectsArray();
Log.d("GOA", "Created Objects Array");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageSourceObject imgView;
if (convertView == null) {
imgView = new ImageSourceObject(mContext);
imgView.setLayoutParams(new GridView.LayoutParams(20, 20));
imgView.getScaleType();
imgView.setScaleType(ScaleType.FIT_XY);
imgView.setPadding(0, 0, 0, 0);
} else {
imgView = (ImageSourceObject) convertView;
}
// Chk status of touched of imgView & set image accordingly
if (imgView.isTouched())
imgView.setImage(R.drawable.droid_touched2);
else
imgView.setImage(imageIds[position]);
return imgView;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getActionMasked();
float currentXPos = event.getX();
float currentYPos = event.getY();
int position = gridViewResAdap.pointToPosition((int)currentXPos, (int) currentYPos);
// Key was Pressed Here
if (action == MotionEvent.ACTION_UP) {
if (position > 0) {
// Get the object which is clicked
ImageSourceObject isb = this.imgObjsArr.get(position);
Log.d("GA", " Postion ID " + isb.getId() + " [] ID : " + imageIds[position]);
// Change the status of touched & set image
isb.setTouched(true);
isb.setImage(R.drawable.droid_touched2);
// Update the ArrayList & Integer[] with this updated obj
this.imgObjsArr.set(position, isb);
imageIds[position] = R.drawable.droid_touched2;
Log.d("ISB", "++++ Object ID : " + isb.getId() + " [] ID : " + imageIds[position] + " ISB Touched :" + isb.isTouched());
Toast.makeText(mContext, "Postion Pressed : " + (position+1),
Toast.LENGTH_SHORT).show();
//this.gridViewResAdap.invalidate();
}
return true;
}
return false;
}
日志:
02-19 15:19:11.615: D/GA(2046): Postion ID 2130837556 [] ID : 2130837556
02-19 15:19:11.617: D/ISB(2046): ++++ Object ID : 2130837559 [] ID : 2130837559 ISB Touched :true
日志显示Integer[]
&中的对象ArrayList
均已更新且具有正确的值。毕竟,图像也不会在屏幕上更新。该gridViewResAdap
也是从活动通过网格的对象。我也尝试调用invalidate()
它,但是没有结果。就像在我的一样getView()
,我正在使用imageIDs
,所以我也将其保持更新。
ImageSourceObject:
public class ImageSourceObject extends ImageView {
public void setImage(int resourceId) {
super.setImageResource(resourceId);
this.setId(resourceId);
}
另外,onTouch()
给打电话给错误onPerformClick()
,我不确定去哪里打电话和为什么打电话。我还没有onClickListener
在适配器中实现。在这种情况下可以做些什么,onClickListener
整理东西时要写什么onTouch()
。
您能帮我知道为什么图像对象没有更新以及我在哪里出错吗?我以为我必须刷新网格,所以也调用了invalidate(),但没有结果。
非常感谢您的帮助。
谢谢
你之后ImageView
开始处理的TouchEvent,它是唯一的视图允许这样做与触摸手势什么。您想GridView
拦截TouchEvent,检查TouchEvent(event.getX(); event.getY()
)的X和Y坐标,并查看这些坐标是否在您的ImageView
对象之一的范围内。如果是,请在ImageView
或可以触发您的setImageDrawable()
方法的标记上设置一个标志。我可以在一个项目中实现类似的效果,但是必须创建一个自定义GridView类(public class yourGridView extends GridView
),然后重写以下内容:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
int action = event.getAction();
switch(action) {
case MotionEvent.ACTION_DOWN:
Log.i(AGL, "InterceptAction = DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(AGL, "InterceptAction = MOVE");
break;
case MotionEvent.ACTION_CANCEL:
Log.i(AGL, "InterceptAction = CANCEL");
return false;
}
return true; //returning true tells your main Activity that you want the custom GridView to handle this TouchEvent; It will then send the TouchEvent to your GridView's onTouchEvent() method for handling.
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch(action) {
case MotionEvent.ACTION_MOVE:
int xCoord = (int) event.getX();
int yCoord = (int) event.getY();
Log.i(AGL, "MOVE EVENT;" + "\n" + "Touch X = " + Integer.toString(xCoord) + "\n" +
"Touch Y = " + Integer.toString(yCoord));
for(int i = 0; i < this.getChildCount(); i++) {
ImageView suspect = (ImageView) this.getChildAt(i);
if(suspect.getBounds().contains(xCoord, yCoord)) {
suspect.CHANGE_YOUR_IMAGE_HERE();
suspect.invalidate();
}
}
break;
}
return true;
}
请注意:getBounds()是我在自定义ImageView
类中编写的一种方法。此方法返回一个Rect对象,该对象表示对象的边界框ImageView
。您将必须使用自己的逻辑来获取您的的边界ImageView
。
另请注意:当我在项目中运行此逻辑时,ImageView
在触摸手势期间,我会快速更改图像。我还没有想出如何将其限制为每个MotionEvent.ACTION_MOVE一个图像更改。
我希望这有帮助。
触摸操作概述 浏览器的触摸 API 由三个部分组成。 Touch:一个触摸点 TouchList:多个触摸点的集合 TouchEvent:触摸引发的事件实例 Touch接口的实例对象用来表示触摸点(一根手指或者一根触摸笔),包括位置、大小、形状、压力、目标元素等属性。有时,触摸动作由多个触摸点(多根手指)组成,多个触摸点的集合由TouchList接口的实例对象表示。TouchEvent接口的实例对
问题内容: 由于Main.storyboard不提供Xcode,如何以编程方式添加UIView touchbegin动作或touchend动作? 问题答案: 您将不得不通过代码添加它。试试这个:
触摸事件是手机游戏中最重要的事件,它易于创建,还能提供多种多样的功能。 让我们先了解一下什么是触摸事件,当你触摸移动设备的屏幕时,设备感受到被触摸,了解到被触摸的位置,同时取得触摸到的内容,然后你的触摸被回答。 这就是触摸事件。 如果你希望通过触摸控制屏幕下层的对象,那可以通过 优先级,达成这种需求,优先级高的对象能先处理事件。 创建触摸事件监听器: // Create a "one by on
在libGDX中的Box2d的帮助下,我让各种身体以一定角度旋转。我想要的是当我点击身体时破坏它,但问题是我无法获得身体的区域定义,这样我就可以检查我的接触点是否位于身体内部。我试过使用actor及其hit()方法,但只有在我不旋转它的情况下,它才会起作用。据我所知,一旦我旋转了身体,它的边界就不会旋转。那么,我们如何检查身体中的触摸事件呢。提前谢谢。
问题内容: 好吧,所以我有4个图像视图。 当他们按下和向上时,我如何控制会发生什么 因此说: 其中一张图像被按下,textview变为1,但是当它们放开时,文本将变为0? 问题答案: 您需要使用OnTouchListener并让它在您的上监听。 例如: 这是一个看起来像的例子:
本文向大家介绍Android触摸事件传递机制,包括了Android触摸事件传递机制的使用技巧和注意事项,需要的朋友参考一下 前言:在Android开发中,经常会遇到触摸事件冲突,比如ViewPager的轮播图跟Fragment的划动事件冲突,或者轮播图跟下拉事件冲突,自定义view的事件处理等,本文章将会详细介绍Activity、View、ViewGroup三者的触摸事件传递机制,传递包括三个阶段