2012-08-02 157 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

相關問題