为触摸另一个项

时间:2015-05-04 11:44:42

标签: android ontouchlistener

我有一个使用自定义网格视图(和适配器)列出卡片的活动。我还有一个常见的自定义菜单布局,它是在网格视图项onTouch方法上创建/显示的。对于自定义菜单中的每个项目,我再次有一个触摸监听器,我想在菜单项上发布一些操作。

这可能听起来令人困惑,所以让我解释一下我想要实现的目标。在我的主要活动中:

  1. 我想显示一个products的列表,我通过JSON api
  2. 从我的网站浏览器中获取
  3. 对于显示的每个项目,我想实现ontouchlistener,触摸时会显示3个项目的菜单。

    • Like Button
    • 购买按钮
    • 分享按钮
  4. 在同一触摸上,如果触摸移动到菜单项上然后释放,我想执行某些操作。

  5. 我现在在哪里?

    目前我已经实现了上述功能,当我触摸列表项时,菜单会显示项目。但当我将触摸移动到项目并释放时没有任何反应。

    因此永远不会触发菜单项的onTouch方法。根据我的理解,这必须发生,因为菜单布局是在产品项目的触摸事件上创建的。

    如果我使用另一个手指(当我仍然按住上一次触摸时)并且专门触摸菜单项,则会调用上面的onTouch方法。

    以下是我的代码

    MainActivity.java

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Initialize the cardMenu
        // This is the menu that will be displayed
        // on the touch method of each product item
        CardMenu cardMenu = (CardMenu) overlayView.findViewById(R.id.card_menu);
    
        final int menuItemLength = CARD_MENU_ITEMS.length;
    
        for (int i = 0; i < menuItemLength; i++) {
            ImageView item = new ImageView(getApplicationContext());
            item.setImageResource(CARD_MENU_ITEMS[i]);
    
            cardMenu.addItem(item, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("DEBUG::", "Card Menu Item Clicked");
                }
            }, new View.OnTouchListener() {
    
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return false;
                }
            });
        }
    
        // Implement Grid view
        adapter = new ProductAdapter(this, R.layout.grid_list_item, productList, this);
        gridView = (StaggeredGridView) findViewById(R.id.grid_view);
        gridView.setAdapter(adapter);
    
        // Add click and scroll listeners to the view
        gridView.setOnItemClickListener(this);
        gridView.setOnScrollListener(this);
    
        // Load the trending product data into the productList
        getTrendingData();
    }
    

    ProductAdapter.java

    RelativeLayout.OnTouchListener onImageTouch = new RelativeLayout.OnTouchListener() {
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v == null) { return false; }
            boolean defaultResult = v.onTouchEvent(event);
    
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                int currentX = (int) event.getX();
                int currentY = (int) event.getY();
                DisplayMetrics metrics = activity.getBaseContext().getResources().getDisplayMetrics();
                int width = metrics.widthPixels;
    
                touchX = currentX;
                touchY = currentY;
                touchedView = v;
                // This shows the menu on the item card
                showCardMenu(v, currentX, currentY);
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                return false;
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                hideCardMenu(); // This hides the car menu
                return false;
            }
    
    
            return true;
        }
    };
    

    CardMenu.java

    public void addItem(View item, OnClickListener listener, OnTouchListener touchListener) {
        cardMenuLayout.addView(item);
        item.setOnClickListener(getItemClickListener(listener));
        item.setOnTouchListener(getItemTouchListener(touchListener));
    }
    
    private OnClickListener getItemClickListener(final OnClickListener listener) {
        return new OnClickListener() {
    
            @Override
            public void onClick(final View viewClicked) {
                Log.d("DEBUG::", "CARD MENU CHILD CLICKED");
            }
        };
    }
    
    private OnTouchListener getItemTouchListener(final OnTouchListener listener) {
        return new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (v == null) {return false;}
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    Log.d("DEBUG::", "ACTION DOWN=======");
                }
    
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    Log.d("DEBUG::", "ACTION MOVE=======");
                }
    
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    Log.d("DEBUG::", "ACTION UP=======");
                }
    
                return true;
            }
        };
    }
    

    所以我希望实现的流程是:

    • 用户触摸产品项目
    • 显示菜单
      • 在保持触摸的同时,用户将手指移动到其中一个菜单项并释放以采取措施
    • 用户发布触控
    • 隐藏菜单项

0 个答案:

没有答案