热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Androidweekview仿小米和iphone日历效果

这篇文章主要为大家详细介绍了基于Androidweekview仿小米和iphone日历效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

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

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

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

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

 
 
   
 
   
 
   
 

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 mNewEvent = new ArrayList(); 
  @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 onMonthChange(int newYear, int newMonth) { 
 
    // Populate the week view with some events. 
    List events = new ArrayList(); 
 
    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, 3); 
    startTime.set(Calendar.MINUTE, 30); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, 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), 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, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.set(Calendar.HOUR_OF_DAY, 5); 
    endTime.set(Calendar.MINUTE, 0); 
    event = new WeekViewEvent(10, getEventTitle(startTime), startTime, 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, 30); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.add(Calendar.HOUR_OF_DAY, 2); 
    endTime.set(Calendar.MONTH, newMonth - 1); 
    event = new WeekViewEvent(2, getEventTitle(startTime), startTime, endTime); 
    event.setColor(getResources().getColor(R.color.event_color_02)); 
    events.add(event); 
    startTime = Calendar.getInstance(); 
    startTime.set(Calendar.HOUR_OF_DAY, 5); 
    startTime.set(Calendar.MINUTE, 30); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.add(Calendar.HOUR_OF_DAY, 2); 
    endTime.set(Calendar.MONTH, newMonth - 1); 
    event = new WeekViewEvent(2, "dddd", startTime, endTime); 
    event.setColor(getResources().getColor(R.color.event_color_01)); 
    events.add(event); 
    startTime = Calendar.getInstance(); 
    startTime.set(Calendar.HOUR_OF_DAY, 5); 
    startTime.set(Calendar.MINUTE, 0); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, 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, getEventTitle(startTime), startTime, 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); 
    startTime.set(Calendar.MINUTE, 0); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.add(Calendar.HOUR_OF_DAY, 3); 
    event = new WeekViewEvent(4, getEventTitle(startTime), startTime, 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); 
    startTime.set(Calendar.MINUTE, 0); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.add(Calendar.HOUR_OF_DAY, 3); 
    event = new WeekViewEvent(5, getEventTitle(startTime), startTime, 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, 0); 
    startTime.set(Calendar.MONTH, newMonth - 1); 
    startTime.set(Calendar.YEAR, newYear); 
    endTime = (Calendar) startTime.clone(); 
    endTime.add(Calendar.HOUR_OF_DAY, 3); 
    event = new WeekViewEvent(5, getEventTitle(startTime), startTime, 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, RectF eventRect) { 
    Toast.makeText(MainActivity.this, "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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
author-avatar
mobiledu2502887833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有