2012-03-20 9 views
0

"日表示"カレンダーアプリケーションを構築しています。私はすでにリストビューで空のカレンダーを作成しており、今では私の予定を追加する必要があります。どのようにして、AndroidのListViewに図形を描画しますか

カーソルがすべてセットアップされていて、予定表を取得することができました。リストビューに描画するだけです。トリッキーな部分は、各リストの行が30分であり、私の予定のいくつかは、数時間まで長くなるかもしれないということです。だから、たとえそれが現在スクリーンから外れていても、アポイントを描くべき場所をリストビュー上で指定できる必要があります。

+0

24時間内の予定時間に応じて長方形のブロックを描きたいですか? – Pavandroid

+0

@Pavandroidはい、そうです。 – dbDev

答えて

1

私は同じ種類の表示をしました。自分のCustomViewを開発し、それをScrollViewに保存しました。このcustomViewの高さは24 * 60ディップです。そのため、pxの代わりにdipを使用するとビューの高さが高くなります(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

コードをいただきありがとうございました。 1つの質問、私はあなたがScrollViewを宣言するのを見ますが、いつあなたはそれを使用しますか? – dbDev

+0

実際に私のプロジェクトには問題がありました。このビューで表示される最初の予定にビューをスクロールする必要があります。したがって、スクロールするために、私は、MainActivityからこのCustomDayViewにスクロールビューのオブジェクトを送ります。その後、私はそれを使用してCustomViewからx、y点までスクロールすることをグローバルにします。 – Pavandroid

+0

更新しますか?正しい場合は、これを正解として選択してください。 – Pavandroid

-1

画面から外れている場合は、何も描画する必要はありません。

このようにリストアダプターを実装します。getItem(int position)メソッドは、各リスト項目が表す時間(実際には時間間隔)を返します。 getView(int position, View convertView, ViewGroup parent)は、指定された位置の対応するアイテムの間隔内にある予定を定義し、この情報に基づいてアイテムのビューを更新します。

また、an endless adapterが必要な場合もあります。

関連する問題