基于Android week view仿小米和iphone日历效果

基于Android week view仿小米和iphone日历效果,第1张

概述前言最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,header以周为单位进行滑动,github上找了很久也没有找到合适的,但找到一相近的开源项目Android-week-view,它不是我们项目所需要的效果,但

前言

最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,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日历效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1143602.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存