2012-03-20 64 views
0

我正在構建「日視圖」日曆應用程序。我已經創建了帶有列表視圖的空白日曆,現在需要添加我的約會。如何在Android中的ListView上繪製形狀

我的光標是全部設置,我能夠檢索我的約會,只需要在列表視圖中繪製它們。棘手的部分是,每個列表行是30分鐘,我的一些約會可能會延長,長達幾個小時。因此,需要能夠指定列表視圖上應該繪製約會的位置,即使它當前不在屏幕上。

+0

您是否想在24小時內根據預約時間繪製矩形塊? – Pavandroid 2012-03-20 10:09:59

+0

@Pavandroid是的,這是正確的。 – dbDev 2012-03-20 16:40:06

回答

1

我做了同樣的觀點。我開發了自己的CustomView並將其保存在ScrollView中。這個customView的高度是24 * 60傾角。所以視圖的高度會隨着我們保持傾角而不是px(我希望你知道px和dip之間的差異)而增加,寬度將是設備屏幕的寬度。

我無法與您分享完整的代碼。但是,可以在這裏部分粘貼。這會給你一個清晰的畫面,處理每一件事。

public class CustomDayView extends View implements OnTouchListener{ 

    private Paint p; 
    private Paint textp; 
    private Paint roundRectP; 
    private int parentWidth = 0; 
    private int parentHeight = 0; 
    private int X_OFFSET = 5; 
    private int Y_OFFSET = 5; 
    private int HOUR_BLOCK_HEIGHT = 60; 
    private int font_max_width; 
    private ScrollView _scrollView; 
    private int least_time_in_hours = 24*60;//6 * 60 
    private RectF _rects[]; 
    private int font_height; 
    private Context context; 


    public CustomDayEmployeeView(Context context) { 
     super(context); 
     this.context = context; 
     init(); 
    } 
    public CustomDayEmployeeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
     init(); 
    } 
    public CustomDayEmployeeView(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
     this.context = context; 
     init(); 
    } 
    private void init(){ 
     //Creating Paint Objects 
    //setting color 
     //setting Fonts 
     this.setOnTouchListener(this); 
    calculateRectValues(); 
    } 

    private void calculateRectValues() { 
     // Calculating the Rects to draw in the paint this includes x,y points starting of the rect and width and height of the rectangle. 
    int font_max_width = calculate the width needed to draw the hours from 0 to 24 hours; 
    for(int i=0;i<no of appts;i++) 
     _rects[j] = new RectF(font_max_width, convertTimetoSeconds("09:30"), screenwidth-font_max_width , convertTimetoSeconds("11:30"); 

    } 

    private int convertTimetoSeconds(String _startTime) { 
     // TODO Auto-generated method stub 
     int total = Integer.parseInt(_startTime.substring(0,_startTime.indexOf(":"))) * 60; 
     total += Integer.parseInt(_startTime.substring(_startTime.indexOf(":")+1, _startTime.length())); 
     return total; 
    } 

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // TODO Auto-generated method stub 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
     parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
     calculateRectValues(); 
     setMeasuredDimension(screenwidth,24 * HOUR_BLOCK_HEIGHT); 
    } 


    public void draw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.draw(canvas); 

     for(int i=0;i<25;i++) 
     { 
      String preString = ""; 
      String poststring = ""; 

      if(i == 12) 
      { 
       preString = "Noon"; 
       poststring = ""; 

      } 
      else if(i%12 == 0) 
      { 
       preString = "12"; 
       poststring = " AM"; 
      } 
      else if(i<12) 
      { 
       preString = i+""; 
       poststring = " AM"; 
      } 
      else 
      { 
       preString = i%12+""; 
       poststring = " PM"; 
      } 
      canvas.drawText(preString, X_OFFSET+3, i * HOUR_BLOCK_HEIGHT + font_height, p); 
      canvas.drawText(poststring, X_OFFSET+p.measureText(preString), i * HOUR_BLOCK_HEIGHT + font_height, p); 
      p.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); 
      p.setColor(Color.parseColor("#cbcaca")); 
      p.setStrokeWidth(0.2f); 
      p.setPathEffect(new DashPathEffect(new float[] {1,2}, 0)); 
      canvas.drawLine(font_max_width, i * (HOUR_BLOCK_HEIGHT)+ font_height/2+HOUR_BLOCK_HEIGHT/2, parentWidth-8, i * (HOUR_BLOCK_HEIGHT)+ font_height/2+HOUR_BLOCK_HEIGHT/2, p); 
      p.setColor(Color.parseColor("#f1f1f1")); 
      p.setPathEffect(new PathEffect()); 
      p.setStrokeWidth(0.2f); 
      canvas.drawLine(font_max_width, i * HOUR_BLOCK_HEIGHT+ font_height/2, parentWidth-8, i * HOUR_BLOCK_HEIGHT+ font_height/2, p); 

     } 
      for(int j=0;j<no of appts;j++) 
      { 
        canvas.drawRoundRect(_rects[j], 3, 3, roundRectP); 
         canvas.drawText(obj._title, _rects[j].left+X_OFFSET,_rects[j].top + font_height + Y_OFFSET, textp); 
      } 
     } 
    } 


    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 
     for(int j=0;j<no of appts;j++) 
     { 
      if(_rects[j].contains(x, y)) 
      { 
     //Selected J appointmrnt 
     } 
     } 
     return true; 
    } 
} 

我想這會幫助你。只需創建Object並將ArrayList中的約會傳遞給此對象的init,然後執行所需的調整即可。

+0

非常感謝你的代碼,它是幫助。一個問題,我看到你聲明瞭一個ScrollView,但是你什麼時候使用它? – dbDev 2012-03-21 15:14:37

+0

其實我的項目有問題。我需要將視圖滾動到此視圖上可見的第一個約會。所以,爲了滾動,我將scrollview的對象從MainActivity發送到這個CustomDayView。之後,我使它成爲全局的,以便通過CustomView滾動到任何x,y點。 – Pavandroid 2012-03-21 15:21:48

+0

有沒有更新?如果無誤,請選擇此爲正確答案。 – Pavandroid 2012-03-22 01:36:30

-1

如果不在屏幕上,則不需要繪製任何東西。

我會以這種方式實現列表適配器:getItem(int position)方法返回每個列表項代表的時間(實際上是時間間隔)。 getView(int position, View convertView, ViewGroup parent)定義哪些約會在給定位置的相應項目的間隔內,並基於該信息更新項目的視圖。您可能還需要an endless adapter