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

前言

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

ff92b118472aece5b42310ab9efef169.png

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

4f9a158f48c347f4bb3570f2c6e67c8c.gif

e16e6e629e4c6b932019cc5ec9cee800.gif

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

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

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">

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"/>

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" />

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" />

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,下载源码看看,我就不再献丑了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、管理员登录中间件和注销

1、根据session去判断用户是否登录&#xff0c;登录后才可以进index首页&#xff0c;否则返回login页面&#xff0c;借助中间件 (1)修改路由 Route::group([middleware > [web,admin.login],prefix>admin,namespace>Admin], function () { //注册一个中间件admin.logi…

HTML阅读打开点击不了,如何让网页文章中的代码可以点击运行

在网页中运行代码HTML5学堂&#xff1a;很多代码网站当中&#xff0c;都会提供运行代码段功能&#xff0c;便于查看代码效果&#xff0c;那么这个是如何实现的呢&#xff1f;一起来看一下——如何在网页中运行代码。HTML5学堂-刘国利said&#xff1a;应该是在2013年的时候&…

html留言回复评论页面模板,HTML5实现留言和回复的页面样式

这篇文章主要介绍了用HTML5如何实现留言和回复样式,需要的朋友可以参考下具体就不做详细讲解了&#xff0c;直接上代码&#xff1a;web开发-webkfa.com*{margin:0;padding:0;-webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */-webkit-t…

html5列表菜单特效,HTML5 SVG汉堡包菜单按钮分段动画特效

这是一款效果非常炫酷的HTML5 SVG汉堡包菜单按钮分段动画特效。该菜单按钮特效在用户点击汉堡包按钮时&#xff0c;按钮会分割为多段&#xff0c;并旋转变形为关闭按钮的状态。当再次点击该按钮时&#xff0c;它会逆向变形为汉堡包图标。该特效是基于Segment.js插件(一款可以只…

计算机选修课学什么,计算机专业都学什么 主要课程有什么

计算机专业的主要学习内容有什么呢&#xff0c;都开设哪些课程呢&#xff0c;下面小编为大家提供计算机专业主要学习内容&#xff0c;仅供大家参考。计算机专业主要学习内容一、数学类主要课程&#xff1a;高等数学、线性代数、离散数学、概率论、数理统计二、语言类主要课程&a…

excel取html文本长度,excel字符长度 怎么计算excel里的字符串的长度

请教&#xff1a;在EXCEL中如何统计字符长度&#xff1f;打开excel文件&#xff0c;确定需要编辑的内容选择功能区的“公式”功能在公式中选择“LEN”功能在text中选择需要编辑的单元格 7、点击“确定” 8、系统自动计算出了单元excel中怎么判断字符串的长度在Excel中可以使用两…

Java虚拟机(JVM)默认字符集详解

Java中对字符串等进行转换字节数组时, 需要根据字符集编码来进行转换, 当不显示的指定字符集编码时(如: "测试".getBytes()), 会使用Charset.defaultCharset()获取到的字符集编码进行转换! 相关代码如下: 上面的代码可以看出, 在JVM中defaultCharset()是在初始化阶段…

计算机本地用户删除后怎么恢复,Default User文件夹被删了怎样恢复

满意答案opposities2013.06.06采纳率&#xff1a;80% 等级&#xff1a;24已帮助&#xff1a;17327人1、开机后出现“Windows 不能加载本地存储的配置文件。此问题的可能原因是安全权限不足或本地配置文件损坏。如果此问题持续存在&#xff0c;请与您的网络管理员联系。倒数3…

08-SSH综合案例:前台用户模块:注册页面的前台JS校验

这个是MyEclipse设置的问题 把设置去掉就没问题了。 你也可以在每一个input后面加个span来显示提示的信息。这些东西也要提交到后台&#xff0c;后台也是要对这些东西进行校验的。转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6377756.html

计算机管理员无法创建密码,找到电脑管理员的密码

轻松找回遗忘的WinXP管理员密码很多“不拘小节”的朋友在使用电脑时&#xff0c;经常是昨天改了Windows XP帐户密码&#xff0c;今天便忘记了内容&#xff0c;把自己锁在“门外”的情况时有发生。对此&#xff0c;大多数朋友只能痛苦的去重新安装系统。其实如果你有以下的条件&…

clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight

clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight是几个困惑了好久的元素属性&#xff0c;趁着有时间整理一下 1. clientWidth 和 clientHeight 网页中的每个元素都具有 clientWidth 和 clientHeight 属性&#xff0c;表示可视区域的宽高&…

API文档工具-Swagger的集成

最近安装了API文档工具swagger&#xff0c;因为Github上已有详细安装教程&#xff0c;且安装过程中没有碰到大的阻碍&#xff0c;所以此文仅对这次安装做一份大致记录 相关网站 Swagger 官方地址&#xff1a;http://swagger.wordnik.com Github安装详解【springmvc集成swagger】…

计算机翻译辅助工具安卓版,计算机辅助翻译软件

OmegaT是一款电脑翻译软件&#xff0c;此软件能够帮助用户对一些机器专业语言进行快速翻译&#xff0c;目前软件支持任何Java的操作系统&#xff0c;用户无需担心系统不支持的问题。另外&#xff0c;软件可以在任意目录中搜索所支持的格式的文件&#xff0c;翻译速度快、准确性…

计算机应用基础试模块5ACCSE,2015年计算机二级《Access》上机最后冲刺卷(1)

二、基本操作题41在考生文件夹下的“Acc1.mdb”数据库中已建立表对象“职工”。试按以下操作要求&#xff0c;完成对表“职工”的编辑修改和操作&#xff1a;(1)将“职工号”字段改名为“编号”&#xff0c;并设置为主键。(2)设置“年龄”字段的有效性规则为“年龄>20”。(3…

情人节引发的血案

首先&#xff0c; 如果你能看到这句话&#xff0c;那我就应该恭喜你&#xff0c;你已经被此文的标题所吸引。不过&#xff0c;千万不要想太多&#xff0c;此文不是什么《今日说法》&#xff0c;但也与法有那么一丁点的关系&#xff1b;此文也不是什么《我们约会吧》&#xff0c…

css 可编辑,如何设置DIV可编辑

「来源: &#xff5c;web前端开发 ID&#xff1a;web_qdkf」如何让一个div变成可编辑状态&#xff0c;比如富文本的输入框就可以用可编辑的div(自定义一个富文本时可用)&#xff0c;类似textare。有2种方案可以实现&#xff1a;1是通过contenteditable属性设置为true&#xff0…

Java中的局部变量表及使用jclasslib进行查看

直接上下载地址 jclasslib是一个独立的工具&#xff0c;不是包含在JDK中的工具&#xff0c;需要自己进行下载&#xff0c;下载地址如下&#xff1a; http://downfile.downcc.com/down/JClassLib_windows.zip 什么是局部变量表 在《java中的栈》中我们说到了一个栈帧至少需要包含…

在线学ajax,ajax学习

AJAX&#xff1a;1. 概念&#xff1a; ASynchronous JavaScript And XML异步的JavaScript 和 XML1. 异步和同步&#xff1a;客户端和服务器端相互通信的基础上* 客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。* 客户端不需要等待服务器端的响应。在服务器处…

服务器网盘系统怎么装,云服务器上怎么安装操作系统

云服务器上怎么安装操作系统 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(…

Ubuntu 16.04 64位安装YouCompleteMe

之前记录在OneNote上感觉有点乱&#xff0c;而且不适合保存shell&#xff0c;这次重新安装又出问题了&#xff0c;干脆写篇博客记录。 从零开始 1、git&#xff08;用来下载vim和相关插件&#xff09; sudo apt-get install git2、cmake&#xff08;用来编译clang-llvm&#xf…