我正在構建「日視圖」日曆應用程序。我已經創建了帶有列表視圖的空白日曆,現在需要添加我的約會。如何在Android中的ListView上繪製形狀
我的光標是全部設置,我能夠檢索我的約會,只需要在列表視圖中繪製它們。棘手的部分是,每個列表行是30分鐘,我的一些約會可能會延長,長達幾個小時。因此,需要能夠指定列表視圖上應該繪製約會的位置,即使它當前不在屏幕上。
我正在構建「日視圖」日曆應用程序。我已經創建了帶有列表視圖的空白日曆,現在需要添加我的約會。如何在Android中的ListView上繪製形狀
我的光標是全部設置,我能夠檢索我的約會,只需要在列表視圖中繪製它們。棘手的部分是,每個列表行是30分鐘,我的一些約會可能會延長,長達幾個小時。因此,需要能夠指定列表視圖上應該繪製約會的位置,即使它當前不在屏幕上。
我做了同樣的觀點。我開發了自己的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,然後執行所需的調整即可。
非常感謝你的代碼,它是幫助。一個問題,我看到你聲明瞭一個ScrollView,但是你什麼時候使用它? – dbDev 2012-03-21 15:14:37
其實我的項目有問題。我需要將視圖滾動到此視圖上可見的第一個約會。所以,爲了滾動,我將scrollview的對象從MainActivity發送到這個CustomDayView。之後,我使它成爲全局的,以便通過CustomView滾動到任何x,y點。 – Pavandroid 2012-03-21 15:21:48
有沒有更新?如果無誤,請選擇此爲正確答案。 – Pavandroid 2012-03-22 01:36:30
如果不在屏幕上,則不需要繪製任何東西。
我會以這種方式實現列表適配器:getItem(int position)
方法返回每個列表項代表的時間(實際上是時間間隔)。 getView(int position, View convertView, ViewGroup parent)
定義哪些約會在給定位置的相應項目的間隔內,並基於該信息更新項目的視圖。您可能還需要an endless adapter。
您是否想在24小時內根據預約時間繪製矩形塊? – Pavandroid 2012-03-20 10:09:59
@Pavandroid是的,這是正確的。 – dbDev 2012-03-20 16:40:06