
前言
最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,header以周为单位进行滑动,github上找了很久也没有找到合适的,但找到一相近的开源项目Android-week-view,它不是我们项目所需要的效果,但是它帮我们实现的Event的添加和事件的处理,这让我们省了不少工作,AndroID-week-vIEw效果如下图
废话不多说,先看看我项目中的效果
主要包括两个核心的类,两个定义控件,上面的WeekheaderVIEw和下面的WeekDayVIEw,都是继承的vIEw,然后计算位置,将上面的week label 和下面的Day text 画上去,通过Scroller和 GestureDetector控制滑动和处理各种事件。废话不多说,直接教大家怎么用。
首先是布局文件,大家可以通过属性去控件文字的大小,背影颜色、焦点颜色等等。
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" tools:context=".MainActivity"> <TextVIEw androID:ID="@+ID/tv_date" androID:layout_wIDth="match_parent" androID:layout_height="30dp" androID:background="#455964" androID:gravity="center" androID:text="2015年1月" androID:textcolor="#ffffff" androID:textSize="16sp"/> <com.guojunustb.library.WeekheaderVIEw androID:ID="@+ID/weekheadervIEw" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_below="@+ID/tv_date" app:firstDayOfWeek2="sunday" app:headerBackgroundcolor="#455964" app:headerDayLabelnormalTextcolor="#ffffff" app:headerDayLabelTextSize="20sp" app:headerDayLabelTodayTextcolor="@androID:color/holo_red_dark" app:headerFocusBackgroundcolor="#ffffff" app:headerFocusSameDayBackgroundcolor="#ffffff" app:headerFocusSameDayTextcolor="#000000" app:headerFocusTextcolor="#000000" app:headerpaddingtop="20dp" app:headerRowGap="40dp" app:headerWeekLabelTextcolor="#ffffff" app:headerWeekLabelTextSize="16sp" /> <com.guojunustb.library.WeekDayVIEw androID:ID="@+ID/weekdayvIEw" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_below="@+ID/weekheadervIEw" androID:visibility="visible" app:columnGap="8dp" app:dayBackgroundcolor="#ffffffff" app:eventTextcolor="@androID:color/white" app:headerColumnBackground="#ffffffff" app:headerColumnpadding="8dp" app:headerColumnTextcolor="@color/toolbar_text" app:headerRowBackgroundcolor="#465a65" app:headerRowpadding="12dp" app:hourHeight="60dp" app:noOfVisibleDays="1" app:textSize="12sp" app:todayBackgroundcolor="#1848adff" app:todayheaderTextcolor="@color/accent" /> </relativeLayout>
java代码
package com.guojunutb.weekvIEw; import androID.app.Activity; import androID.graphics.RectF; import androID.os.Bundle; import androID.Widget.TextVIEw; import androID.Widget.Toast; import com.guojunustb.library.DateTimeInterpreter; import com.guojunustb.library.WeekDayVIEw; import com.guojunustb.library.WeekheaderVIEw; import com.guojunustb.library.WeekVIEwEvent; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; /** * */ public class MainActivity extends Activity implements WeekDayVIEw.Monthchangelistener,WeekDayVIEw.EventClickListener,WeekDayVIEw.EventLongPressListener,WeekDayVIEw.EmptyVIEwClickListener,WeekDayVIEw.EmptyVIEwLongPressListener,WeekDayVIEw.ScrollListener { //vIEw private WeekDayVIEw mWeekVIEw; private WeekheaderVIEw mWeekheaderVIEw; private TextVIEw mTv_date; List<WeekVIEwEvent> mNewEvent = new ArrayList<WeekVIEwEvent>(); @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); assignVIEws(); } private voID assignVIEws() { mWeekVIEw = (WeekDayVIEw) findVIEwByID(R.ID.weekdayvIEw); mWeekheaderVIEw= (WeekheaderVIEw) findVIEwByID(R.ID.weekheadervIEw); mTv_date =(TextVIEw)findVIEwByID(R.ID.tv_date); //init WeekVIEw mWeekVIEw.setMonthchangelistener(this); mWeekVIEw.setEventLongPressListener(this); mWeekVIEw.setonEventClickListener(this); mWeekVIEw.setScrollListener(this); mWeekheaderVIEw.setDateSelectedchangelistener(new WeekheaderVIEw.DateSelectedchangelistener() { @OverrIDe public voID onDateSelectedChange(Calendar oldSelectedDay,Calendar newSelectedDay) { mWeekVIEw.goToDate(newSelectedDay); } }); mWeekheaderVIEw.setScrollListener(new WeekheaderVIEw.ScrollListener() { @OverrIDe public voID onFirstVisibleDayChanged(Calendar newFirstVisibleDay,Calendar oldFirstVisibleDay) { mWeekVIEw.goToDate(mWeekheaderVIEw.getSelectedDay()); } }); setupDateTimeInterpreter(false); } /** * Set up a date time interpreter which will show short date values when in week vIEw and long * date values otherwise. * * @param shortDate True if the date values should be short. */ private voID setupDateTimeInterpreter(final boolean shortDate) { final String[] weekLabels={"日","一","二","三","四","五","六"}; mWeekVIEw.setDateTimeInterpreter(new DateTimeInterpreter() { @OverrIDe public String interpretDate(Calendar date) { SimpleDateFormat weekdaynameFormat = new SimpleDateFormat("EEE",Locale.getDefault()); String weekday = weekdaynameFormat.format(date.getTime()); SimpleDateFormat format = new SimpleDateFormat("d",Locale.getDefault()); return format.format(date.getTime()); } @OverrIDe public String interpretTime(int hour) { return String.format("%02d:00",hour); } @OverrIDe public String interpretWeek(int date) { if(date>7||date<1){ return null; } return weekLabels[date-1]; } }); } @OverrIDe public List<WeekVIEwEvent> onMonthChange(int newYear,int newMonth) { // Populate the week vIEw with some events. List<WeekVIEwEvent> events = new ArrayList<WeekVIEwEvent>(); Calendar startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,3); startTime.set(Calendar.MINUTE,0); startTime.set(Calendar.MONTH,newMonth - 1); startTime.set(Calendar.YEAR,newYear); Calendar endTime = (Calendar) startTime.clone(); endTime.add(Calendar.HOUR,1); endTime.set(Calendar.MONTH,newMonth - 1); WeekVIEwEvent event = new WeekVIEwEvent(1,"This is a Event!!",startTime,endTime); event.setcolor(getResources().getcolor(R.color.event_color_01)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,30); startTime.set(Calendar.MONTH,newYear); endTime = (Calendar) startTime.clone(); endTime.set(Calendar.HOUR_OF_DAY,4); endTime.set(Calendar.MINUTE,30); endTime.set(Calendar.MONTH,newMonth - 1); event = new WeekVIEwEvent(10,getEventTitle(startTime),endTime); event.setcolor(getResources().getcolor(R.color.event_color_02)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,4); startTime.set(Calendar.MINUTE,20); startTime.set(Calendar.MONTH,5); endTime.set(Calendar.MINUTE,0); event = new WeekVIEwEvent(10,endTime); event.setcolor(getResources().getcolor(R.color.event_color_03)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,5); startTime.set(Calendar.MINUTE,newYear); endTime = (Calendar) startTime.clone(); endTime.add(Calendar.HOUR_OF_DAY,2); endTime.set(Calendar.MONTH,newMonth - 1); event = new WeekVIEwEvent(2,endTime); event.setcolor(getResources().getcolor(R.color.event_color_02)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,"dddd",endTime); event.setcolor(getResources().getcolor(R.color.event_color_01)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.HOUR_OF_DAY,newYear); startTime.add(Calendar.DATE,1); endTime = (Calendar) startTime.clone(); endTime.add(Calendar.HOUR_OF_DAY,3); endTime.set(Calendar.MONTH,newMonth - 1); event = new WeekVIEwEvent(3,endTime); event.setcolor(getResources().getcolor(R.color.event_color_03)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.DAY_OF_MONTH,15); startTime.set(Calendar.HOUR_OF_DAY,3); event = new WeekVIEwEvent(4,endTime); event.setcolor(getResources().getcolor(R.color.event_color_04)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.DAY_OF_MONTH,1); startTime.set(Calendar.HOUR_OF_DAY,3); event = new WeekVIEwEvent(5,endTime); event.setcolor(getResources().getcolor(R.color.event_color_01)); events.add(event); startTime = Calendar.getInstance(); startTime.set(Calendar.DAY_OF_MONTH,startTime.getActualMaximum(Calendar.DAY_OF_MONTH)); startTime.set(Calendar.HOUR_OF_DAY,15); startTime.set(Calendar.MINUTE,endTime); event.setcolor(getResources().getcolor(R.color.event_color_02)); events.add(event); events.addAll(mNewEvent); return events; } private String getEventTitle(Calendar time) { return String.format("Event of %02d:%02d %s/%d",time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE),time.get(Calendar.MONTH) + 1,time.get(Calendar.DAY_OF_MONTH)); } @OverrIDe public voID onEventClick(WeekVIEwEvent event,RectF eventRect) { Toast.makeText(MainActivity.this,"Clicked " + event.getname(),Toast.LENGTH_SHORT).show(); } @OverrIDe public voID onEventLongPress(WeekVIEwEvent event,"Long pressed event: " + event.getname(),Toast.LENGTH_SHORT).show(); } @OverrIDe public voID onEmptyVIEwClicked(Calendar time) { Toast.makeText(MainActivity.this,"Empty VIEw clicked " + time.get(Calendar.YEAR) + "/" + time.get(Calendar.MONTH) + "/" + time.get(Calendar.DAY_OF_MONTH),Toast.LENGTH_LONG).show(); } @OverrIDe public voID onEmptyVIEwLongPress(Calendar time) { Toast.makeText(MainActivity.this,"Empty VIEw long clicked " + time.get(Calendar.YEAR) + "/" + time.get(Calendar.MONTH) + "/" + time.get(Calendar.DAY_OF_MONTH),Toast.LENGTH_LONG).show(); } @OverrIDe public voID onFirstVisibleDayChanged(Calendar newFirstVisibleDay,Calendar oldFirstVisibleDay) { } @OverrIDe public voID onSelectedDaeChange(Calendar selectedDate) { mWeekheaderVIEw.setSelectedDay(selectedDate); mTv_date.setText(selectedDate.get(Calendar.YEAR)+"年"+(selectedDate.get(Calendar.MONTH)+1)+"月"); } } WeekheaderVIEw 和WeekDayVIEw相互监听对方的滑动才能实现联动。第一次写博客,就说这么多了,有兴趣的朋友可以去github,下载源码看看,我就不再献丑了。
下载地址:Sample-android-week-view
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的基于Android week view仿小米和iphone日历效果全部内容,希望文章能够帮你解决基于Android week view仿小米和iphone日历效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)