如何从一组视图中选择一个特定的视图?

时间:2012-08-02 17:31:36

标签: android ontouchlistener onlongclicklistener custom-view

对于我需要开发的应用,当select one view上的用户ViewGroup必须弹出警告对话框时,我需要能够long press view我将根据要求选择选项,这些是删除视图和更改该特定视图的背景颜色。我正在创建不同的自定义视图(自定义视图从View扩展),它有Touchlistener。动态地将这些视图附加到布局(RelativeLayout)。让我们假设我的布局有3个视图。

我的问题:

  • 我想从布局上的可用视图列表中选择一个视图。
  • 如何限制自定义视图大小,而不是占用完整的父视图。

我面临的问题是这样的:如果我为自定义视图设置背景颜色,请看这个图像它看起来像这样,实际上我设置了布局背景颜色白色这里自定义视图占据全屏。所以,无法看到父背景颜色。这里有自定义视图大小的问题,无法限制自定义视图大小而不是占用完整父视图。即使我在自定义视图之外触摸,自定义视图的触摸侦听器也会触发。我想将这些触控听众限制在我的自定义视图中..

enter image description here

主要要求: 最后,我想要实现如下图像,现在我可以添加更多自定义视图到布局,但无法删除选定的一个。当我长按布局中的任何一个视图时,它应该弹出一个带有两个按钮的警告对话框,如果我选择一个选定的视图应该删除另一个选择背景颜色。

enter image description here

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 个答案:

答案 0 :(得分:1)

您应该覆盖onSizeChangedonMeasure种方法,让ViewGroup知道您的观点大小。并确保您的视图的宽度和高度均为WRAP_CONTENT

关于触摸事件 - 此处的问题是您的视图大小与父级大小匹配,因此它会拦截所有触摸事件(因为它会在true中返回onTouchEvent)。

这是a great tutorial

答案 1 :(得分:0)

将OnLongClickListener添加到自定义视图,然后再将其添加到视图组。

为了帮助识别更高级别的视图,您可能希望使用setTag(“id”,id)在视图上设置标识符;

答案 2 :(得分:0)

如果我理解正确,你添加的视图太大并填充它的父母 做

之类的事情还不够
TwoPointsDraw drawView = new TwoPointsDraw(context);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
drawView.setLayoutParams(lp)
frame.addView(drawView); 

答案 3 :(得分:0)

结帐此项目,可能会有所帮助=> Android multitouch controller,一个用于Android的简单多点触控缩放缩放库。

这是另一个example