当前位置: 首页 > 面试题库 >

Android:在Adapter中的触摸事件上更新GridView中的图像

邢雨华
2023-03-14
问题内容

我有一个GridView附加的适配器。适配器在网格中填充图像。我已经设置setOnTouchListerGridViewActivity并且仅在适配器中实现。在适配器中,我有一个Integer[] imageIDs包含所有已添加图像的资源ID的ID,它包含一个ArrayList<ImageSourceObject> imgObjsArr扩展的ID
ImageView和其他属性设置的ID 。

现在onTouch(),我想将所选图像的图像更改为其他图像。这里是我的代码:在设置网格的适配器ActivityonCreate

        // 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三者的触摸事件传递机制,传递包括三个阶段