安卓:在GridView控件更新图片在适配器触摸事件 [英] Android : Update Image in GridView on touch event in Adapter
问题描述
我有一个的GridView
和连接适配器它。适配器填充图像在网格中。我已经设置 setOnTouchLister
到的GridView
在我的活动
实施在适配器只。在适配器我有一个整数[] imageIDs
包含添加和放大器所有图像资源ID;一个的ArrayList< ImageSourceObject> imgObjsArr
扩展的ImageView
&放大器;有其他属性进行设置。
I have a GridView
and attached adapter to it. Adapter populates images in the grid. I have set setOnTouchLister
to GridView
in my Activity
and implemented in the adapter only. In adapter I have an Integer[] imageIDs
that contains resource ids of all images that are added & an ArrayList<ImageSourceObject> imgObjsArr
that extends ImageView
& has other properties set.
现在 onTouch()
,我要选择的图像的图像切换到另一个。这是我的code:
设置网格的适配器活动
在的onCreate
:
Now onTouch()
, I want to change the image of the selected image to other one. Here's my code :
SEtting adapter of grid in Activity
in 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
日志说,在对象整数[]
&放大器; 的ArrayList
都被更新和放大器;有正确的价值观。毕竟这也图像不更新在屏幕上。在 gridViewResAdap
也是网格是从该活动传递的对象。我打过电话无效()
它也有,但还没有结果。正如我在 getView()
,我使用 imageIDs
,所以我一直也更新。
The logs say that the object in Integer[]
& ArrayList
both are updated & have right values. After all this also the image is not updated on the screen. The gridViewResAdap
is also the object of grid that is passed from the activity. I tried calling invalidate()
on it also, but yet no results. As in my getView()
, I am using imageIDs
, so I have kept that also updated.
ImageSourceObject:
ImageSourceObject :
public class ImageSourceObject extends ImageView {
public void setImage(int resourceId) {
super.setImageResource(resourceId);
this.setId(resourceId);
}
此外, onTouch()
给出错误调用 onPerformClick()
,我不知道在哪里可以打电话和放;为什么打电话。我还ALOS没有在适配器实现 onClickListener
。有什么可以在这种情况下,和放大器来完成;在 onClickListener
写的东西当事情manged在 onTouch()
。
Also, onTouch()
gives error to call onPerformClick()
, I am not sure where to call & why to call. I have alos not implemented onClickListener
in the adapter. What can be done in this case & what to write in onClickListener
when things are manged in onTouch()
.
你能帮我知道为什么图像对象不更新和我要去哪里错了?我想我还需要刷新网格,所以也被称为无效(),但没有结果。
Can you help me know why the image object is not updating and where am I going wrong ? I thought I have to refresh the grid, so have also called invalidate(), but no results.
任何帮助是非常AP preciated。
Any help is highly appreciated.
感谢
推荐答案
在你的的ImageView
开始处理的TouchEvent,它被允许与触摸做任何事情的唯一视图手势。你希望你的的GridView
拦截的TouchEvent,检查的X和使用TouchEvent( Y坐标event.getX(); event.getY()
),看看这些坐标落在你的的ImageView
对象之一的范围内。如果是的话,在的ImageView
什么设置标志,可以触发你的 setImageDrawable()
方法。我能够实现我的项目之一同样的效果,但我不得不创建一个自定义的GridView类(公共类yourGridView扩展的GridView
),然后覆盖以下内容:
After your ImageView
begins handling the TouchEvent, it is the only view allowed to do anything with that touch gesture. You want your GridView
to intercept the TouchEvent, check the X and Y coordinates of the TouchEvent (event.getX(); event.getY()
) and see if those coordinates fall within the bounds of one of your ImageView
objects. If yes, set a flag on the ImageView
or something that can trigger your setImageDrawable()
method. I was able to achieve a similar effect in one of my projects but I had to create a custom GridView class (public class yourGridView extends GridView
), then override the following:
@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
类写道。此方法返回重新presents的的ImageView
对象的边框将RECT对象。你将不得不使用自己的逻辑取的边界你的的ImageView
。
PLEASE NOTE: getBounds() is a method I wrote in my custom ImageView
class. This method returns a Rect object that represents the bounding box of the ImageView
object. You will have to use your own logic for fetching the bounds of your ImageView
.
另外请注意:当我在我的项目运行这个逻辑,我的的ImageView
更迭图像快速触摸手势过程中。我还没有想出但如何将其限制在每MotionEvent.ACTION_MOVE一个图像的变化。
ALSO NOTE: When I run this logic in my project, my ImageView
s change images rapidly during the touch gesture. I haven't figured out yet how to limit it to one image change per MotionEvent.ACTION_MOVE.
我希望这有助于。
这篇关于安卓:在GridView控件更新图片在适配器触摸事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!