2

我坚持这一点:我有一个 ViewGroup 托管几个视图。所有视图都有布局参数:match_parent/match_parent。视图可以像在图片上一样放置在另一个之上。

应选择触摸事件视图(如果在其填充的矩形上发生点击),并且每次只能选择一个视图。

实现这一点的最佳方法是什么?

在此处输入图像描述

升级版:

视图中的代码:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();
    // if it's over filled area
    if (mBounds.contains((int)eventX, (int)eventY)) {
        // set current view selected or perform other stuff
        // also at this moment we need to unselect all siblings
        mGestureDetector.onTouchEvent(event); 
        return true;
    } else {
        setSelected(false);
        return false;
    }
}
4

2 回答 2

1

View创建一个表示在 custom 中选择的当前子项的字段ViewGroup。当您遇到触摸事件时,请检查您是否有以前的View选择以及是否有可能是相同的视图。如果不是,则取消选中上一个视图并使其指向当前视图。我猜发布的代码是针对子视图的,在这种情况下,您可以创建一个回调接口,其中父级ViewGroup实现每次选择视图时都会调用的接口。下面是一个小模板:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();
    // if it's over filled area
    if (mBounds.contains((int)eventX, (int)eventY)) {
        mListener.onViewSelected(this);
        // set current view selected or perform other stuff
        // also at this moment we need to unselect all siblings
        mGestureDetector.onTouchEvent(event); 
        return true;
    } else {
        setSelected(false);
        return false;
    }
}

在父母中ViewGroup

public class NiceViewGroup extends ViewGroup implements OnViewSelected {

   private View mCurrentSelectedView = null;

   public void onViewselected(View selected) {
        if (mCurrentSelectedView == null || mCurrentSelectedView == selected) {
             return;
        } else {
             mCurrentSelectedView.unselectView();
             mCurrentSelectedView = selected;      
        }    
   }        

当然,ViewGroup当您创建子视图时,您必须将父级作为侦听器传递。

于 2012-08-26T05:11:34.313 回答
0

在您的视图中添加对 onClickListeners 的支持(默认情况下不支持)

public class myCustomView extends View {
    boolean clicking = false;
    OnClickListener onClickListener;

    public void setOnClickListener(OnClickListener ocl) {
        onClickListener = ocl;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            boolean clicking = true;
            return true;
        case MotionEvent.ACTION_UP:
            if (clicking) {
                if (onClickListener != null) {
                    onClickListener.onClick(this);
                }
                clicking = false;
                return true;
            }
            return false;
        default:
            clicking = false;
            return false;
        }
    }
于 2012-08-25T22:38:14.760 回答