2012-08-02 40 views
2

对于我需要开发的应用程序,我需要能够从select one viewview上的用户long press必须弹出一个警告对话框,从那我将根据要求选择选项,这些都是删除视图和更改背景该特定视图的颜色。我创建了不同的自定义视图(自定义视图从视图延伸),它有Touchlistener的。将这些视图动态添加到布局(RelativeLayout)。让我们假设我的布局有3个视图。如何从视图组中选择一个特定视图?

我的问题:

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

我现在面临的问题是这样的:看这个图片,如果我设置自定义背景色查看它看起来就像这样,其实我是为布局背景颜色设为白色这里自定义视图占据整个屏幕。所以,无法看到父母的背景颜色。这里customView的大小有问题,无法限制customview的大小而不是占用完整的父视图。即使我触摸自定义视图之外,自定义视图的触摸监听器也会触发。我想限制那些触摸监听器仅限于我的自定义视图。

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); 
    } 
}); 

,这是customview:

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); 
} 
+0

我们不能在没有看到相关代码的情况下为您提供帮助。也许有人会_guess_发生了什么,但也许不是... – Sam 2012-08-02 17:53:15

+0

@Sam我已更新我的问题与相关代码。如果它不清楚让我知道。 – 2012-08-02 18:00:04

回答

1

您应该重写onSizeChangedonMeasure方法,让你的ViewGroup知道你的视图的大小。并确保您的视图的宽度和高度都是WRAP_CONTENT

关于触摸事件 - 这里的问题是您的视图大小与父级大小匹配,所以它拦截所有触摸事件(因为它返回trueonTouchEvent)。

这里是a great tutorial

+0

我将通过使用Touch Listener的自定义视图拉动点来动态更改这些自定义视图大小.. – 2012-08-06 06:34:40

+0

@RajaReddyP然后您应该在'onMeasure'方法中精确改变视图大小。因此,在您的触摸监听器中,您将设置必需的属性并强制视图调用'onMeasure'(但不要直接调用它)。通过这种方法,你可以告诉你的布局有多大你的观点。 – 2012-08-06 06:36:54

+0

我不知道如何设置这些功能,我对Customview没有任何经验。 – 2012-08-06 06:44:36

0

将其添加到视图组之前添加OnLongClickListener到customview。

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

+0

我试过这样,首先无法从视图列表中选择一个特定的视图。这是主要问题 – 2012-08-06 06:47:53

+0

您的意思是说有用户界面问题,或者您在确定点击哪个视图时遇到问题?要确定你点击了哪个视图,你需要从view.getTag(“id”); – 2012-08-06 07:00:37

+0

不是UI问题,无法从视图组中选择视图.let我们假设我有3个自定义视图的布局,现在我想在长按视图时选择一个视图。即使我为每个自定义视图添加了长按代码,但它并没有触发,总是只能调用touchlisteners。 – 2012-08-06 07:04:05

0

如果我正确理解你,你添加的视图太大,填充它的父母。
是不是足够做一些像

TwoPointsDraw drawView = new TwoPointsDraw(context); 
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, 
        LayoutParams.WRAP_CONTENT); 
drawView.setLayoutParams(lp) 
frame.addView(drawView); 
+0

如果在View类中没有'onMeasure',它将无法正常工作。 – 2012-08-06 06:28:37

+0

我试过这样也不成功.. – 2012-08-06 06:33:26

0

结帐这个项目,它可能会有所帮助=>Android multitouch controller,一个简单的多点触控双指缩放库为Android。

这是另一个example

+0

我不是在寻找多点触摸,如果我有一些看法如何从中选择一个.. – 2012-08-09 11:41:23

+0

有一个库MTController和一个示例MTPhotoSortr。只需在模拟器中运行此示例并检查。在一个视图中有2-3个图像,并在您触摸时进行选择。所以这个逻辑可能会有助于你实现你想要的。 – 2012-08-09 11:56:50

相关问题