Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了基于Android week view仿小米和iphone日历效果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,header以周为单位进行滑动,github上找了很久也没有找到合适的,但找到一相近的开源项目Android-week-view,它不是我们项目所需要的效果,但是它帮我们实现的Event的添加和事件的处理,这让我们省了不少工作,Android-week-view效果如下图

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

废话不多说,先看看我项目中效果

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

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

       主要包括两个核心的类,两个定义控件,上面的WeekHeaderView和下面的WeekDayView,都是继承的view,然后计算位置,将上面的week label 和下面的Day text 画上去,通过Scroller和 GestureDetector控制滑动和处理各种事件。废话不多说,直接教大家怎么用。

      首先是布局文件,大家可以通过属性去控件文字的大小,背影颜色、焦点颜色等等。

<RelativeLayout xmlns:android="http://scheR_997_11845@as.android.com/apk/res/android" 
  xmlns:app="http://scheR_997_11845@as.android.com/apk/res-auto" 
  xmlns:tools="http://scheR_997_11845@as.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.datetiR_997_11845@eInterpreter; 
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()); 
      } 
    }); 
    setupdatetiR_997_11845@eInterpreter(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 setupdatetiR_997_11845@eInterpreter(final Boolean shortDatE) { 
    final String[] weekLabels={"日","一","二","三","四","五","六"}; 
    mWeekView.setdatetiR_997_11845@eInterpreter(new datetiR_997_11845@eInterpreter() { 
      @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日历效果所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。