カスタムビューにButtonボタンを追加したり、クリックイベントを実装したりすることについて

3679 ワード

環境:プロジェクト内のカスタムビューにButtonを追加し、クリックイベントを実装する必要があります.主な問題:Buttonコントロールを追加できますが、現在の能力は限られています.OnClickリスニングは実現できません.
現在の解決策:1、dispatchDrawにButtonボタン(長方形を塗りつぶす)を描画し、同じ領域にTextViewを描画して初期化し、ボタン文字を追加します.
private void initmArea() {
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        mTouchArea = new TextView(getContext());
        ......
        mTouchArea.setText(" ");
        addView(mTouchArea);
    }

2、onTouchEventでのACTION_DOWNに判定を追加:指クリック領域が描画領域内にある場合、フラグビット(boolean)mTouch=true;
 public boolean inArea(MotionEvent event, TextView mTouchArea) {
        Rect rect = new Rect();
        int[] location = new int[2];
        mTouchArea.getLocationOnScreen(location);
        rect.left = location[0];
        rect.top = location[1];
        rect.right = mTouchArea.getWidth() + location[0];
        rect.bottom = mTouchArea.getHeight() + location[1];
        if (rect.contains((int) event.getRawX(), (int) event.getRawY())) {
            return true;
        }else {
            return false;
        }
    }
case MotionEvent.ACTION_DOWN:
                ......
                //  TextView 
                if (inArea(event, mTouchArea)){
                    mTouch = true;
                }
                ......
                break;

case MotionEvent.ACTION_UP:
                ......
                mTouch = false;
                break;

3、dispatchDraw/onDrawで応答イベントを実現する
 @Override
    protected void dispatchDraw(Canvas canvas) {
        ......
        if (mTouch) {
          ......
            }
        ......
        super.dispatchDraw(canvas);
    }

以上、完了、記録のみします.