2

私はこれで立ち往生しています:いくつかのビューをホストするViewGroupがあります。すべてのビューにはレイアウト パラメーターがあります: match_parent/match_parent。ビューは、写真のように重ねて配置できます。

タッチ イベントでビューを選択する必要があり (塗りつぶされた四角形をタップした場合)、一度に選択できるビューは 1 つだけです。

これを実装する最良の方法は何ですか?

ここに画像の説明を入力

更新:

ビュー内のコード:

@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カスタムで選択された現在の子を表すフィールドを作成します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 に答える