2

私が開発する必要があるアプリの場合、ユーザーが警告ダイアログをポップアップする必要があるときselect one viewから、要件に応じてオプションを選択できるようにする必要があります。それらは、ビューを削除し、その特定のビューの背景色を変更します。私は別のカスタムビューを作成しています(カスタムビューはビューから拡張されています)、それにはタッチリスナーがあります。これらのビューをレイアウト (RelativeLayout) に動的にアタッチします。レイアウトに 3 つのビューがあるとします。ViewGrouplong pressview

私の質問:

  • レイアウトで使用可能なビューのリストから 1 つのビューを選択したいと考えています。
  • 親ビュー全体を占有するのではなく、カスタム ビューのサイズを制限する方法。

私はこのような問題に直面しています:カスタムビューの背景色を設定すると、この画像を見てください. そのため、親の背景色を表示できません。カスタムビューのサイズに問題があり、完全な親ビューを占有するのではなく、カスタムビューのサイズを制限できません。カスタムビューの外に触れても、カスタムビューのタッチリスナーがトリガーされました。これらのタッチリスナーをカスタムビューのみに制限したい..

ここに画像の説明を入力.

主な要件: 最後に、この下の画像のようにしたいと考えています。これで、カスタム ビューをレイアウトに追加できますが、選択したビューを削除できません。レイアウトからビューのいずれかを長押しすると、2 つのボタンを含む 1 つの警告ダイアログがポップアップ表示されます。選択したビューを選択すると、別の選択の背景色の変更のために削除する必要があります。

ここに画像の説明を入力

RelaventCode:このようにレイアウトにビューを追加しています。

findViewById(R.id.line).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        CustomView drawView = new CustomView(context);
        frame.addView(drawView);
   }
});

これはカスタムビューです:

public class CustomView extends View {

public CustomView (Context context) {
    super(context);
    init();
}
private void init() {

    Paint paint = new Paint();
    Paint pai = new Paint();         
    Path path = new Path();
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(5);
    path.lineTo(50, 100);       
}

@Override
public void onDraw(Canvas canvas) {
    path.setFillType(Path.FillType.EVEN_ODD);
    path.moveTo(Top_Point.x, Top_Point.y);
    path.lineTo(Right_Point.x, Right_Point.y);
    path.lineTo(Left_Point.x, Left_Point.y);
    path.lineTo(Top_Point.x, Top_Point.y);
    path.close();
    canvas.drawPath(path, Inner_Paint);
    canvas.drawLine(Top_Point.x, Top_Point.y, Right_Point.x, Right_Point.y,
            Lines_Paint);
    canvas.drawLine(Right_Point.x, Right_Point.y, Left_Point.x,
            Left_Point.y, Lines_Paint);
    canvas.drawLine(Left_Point.x, Left_Point.y, Top_Point.x, Top_Point.y,
            Lines_Paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {     
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        PointF NewP = new PointF(0, 0);
        NewP.x = event.getX();
        NewP.y = event.getY();
        if (TopTouchArea.contains(event.getX(), event.getY())) {
            currentTouch = TOUCH_TOP;
        } else if (RightTouchArea.contains(event.getX(), event.getY())) {
            currentTouch = TOUCH_RIGHT;
        } else if (LeftTouchArea.contains(event.getX(), event.getY())) {
            currentTouch = TOUCH_LEFT;
        } else if (a) {
            Translate_Point.x = event.getX();
            Translate_Point.y = event.getY();
            currentTouch = Inner_Touch;
            return true; // Return false if user touches none of the
                            // corners
        } else {
            return false;
        }

        return true; 
    case MotionEvent.ACTION_MOVE:
        switch (currentTouch) {
        case TOUCH_TOP:
               /*  ------ */
        case TOUCH_RIGHT:
               /*   ----- */
            invalidate();
            return true;
        case TOUCH_LEFT:
         /* ------ */
            invalidate();
            return true;
        case Inner_Touch:
            /* ------ */
            invalidate();
            return true;
        }           
        return false; 
    case MotionEvent.ACTION_UP:         
        switch (currentTouch) {
        case TOUCH_TOP:
            /* ----- */
            return true;
        case TOUCH_RIGHT:
            /* ----- */
            return true;
        case TOUCH_LEFT:
            /* ----- */
            return true;
        case Inner_Touch:
            /* ----- */
            invalidate();  
        return true;
        }           
        return false;
    }
    return super.onTouchEvent(event);
}
4

4 に答える 4

0

このプロジェクトをチェックしてください、それは役に立つかもしれません=> Androidマルチタッチコントローラー、Android用のシンプルなマルチタッチピンチズームライブラリ。

別のを次に示します。

于 2012-08-09T11:29:48.287 に答える
0

onSizeChangedまたはonMeasureメソッドをオーバーライドしViewGroupて、ビューのサイズを通知する必要があります。また、ビューの幅と高さが両方であることを確認してくださいWRAP_CONTENT

タッチイベントについて-ここでの問題は、ビューサイズが親サイズと一致しているため、すべてのタッチイベントをインターセプトすることです(で戻るtrueためonTouchEvent)。

そしてここに素晴らしいチュートリアルがあります

于 2012-08-06T06:15:40.603 に答える
0

ビューグループに追加する前に、OnLongClickListenerをカスタムビューに追加します。

より高いレベルでビューを識別しやすくするために、setTag( "id"、id);を使用してビューに識別子を設定することをお勧めします。

于 2012-08-06T06:16:07.750 に答える
0

私があなたを正しく理解していれば、あなたが追加したビューは大きすぎて、その親を埋めています。
のようなことをするだけで十分ではありませんか

TwoPointsDraw drawView = new TwoPointsDraw(context);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
drawView.setLayoutParams(lp)
frame.addView(drawView); 
于 2012-08-06T06:21:35.597 に答える