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,一经查实,立即删除!

相关文章

Deque - leetcode 【双端队列】

239. Sliding Window Maximum //大概思路是用双向队列保存数字的下标&#xff0c;遍历整个数组&#xff0c;如果此时队列的首元素是i - k的话&#xff0c;表示此时窗口向右移了一步&#xff0c;则移除队首元素。然后比较队尾元素和将要进来的值&#xff0c;如果小的话就都移除&…

android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)

之前发过一个databinding版的通用adapter&#xff0c;能实现一般需求&#xff0c;不过功能比较简陋&#xff0c;实际开发中大家更倾向于使用BRVAH等功能丰富的第三方框架。现在给出一个基于BRVAH的databinding版通用Adapter。BaseAdapterabstract class BaseAdapter(private va…

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年的时候&…

angular-cli构建

angular-cli全称Command Line Interface 命令行界面 1使用命令 npm install -g angular-cli 安装angular-cli, 2安装完成后使用cli快速常见一个angular模板, 3ng serve启动项目 4在模板(seed/种子)的基础上进行修改 ############################## 在typescript中引用leanclou…

模仿块级作用域

模仿块级作用域 JavaScript中没有块级作用域&#xff0c;这意为着在块语句中定义的变量&#xff0c;实际上是包含在函数中而非语句中创建的。 下面的这个实例可以看出: function outputNumbers(count){for (var i0; i < count; i){alert(i);}alert(i); //count }outputNum…

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…

UVA-714 二分

把可能的进行二分判断&#xff0c;判断的时候尽量向右取&#xff0c;一直取到不能去为止&#xff0c;这样才有可能成功分割。 判断是否可以把up作为最大值的代码&#xff1a; bool judge(LL up){if(up < Big) return false; //Big是数组中最大值&#xff0c;如果up小于最大值…

html5不支持的属性,HTML5 常用语法一览(列举不支持的属性)

HTML头部标记标记描述HTML5标准定义页面中所有链接的基准URL设定显示在浏览器左上方的标题内容表明该文档是一个可用于检索的网关脚本不支持文档本身的元信息,例如查询关键词,有效期等设定CSS层叠样式表内容设定外部资源的链接页面脚本内容元信息标记属性标记描述值HTML5标准ht…

守护线程

/*守护线程&#xff08;后台线程&#xff09;:在一个进程中如果只剩下了守护线程&#xff0c;那么守护线程也会死亡。需求&#xff1a; 模拟QQ下载更新包。一个线程默认都不是守护线程。*/ public class Demo7 extends Thread {public Demo7(String name){super(name);}Overrid…

c 的word转为html5,word与html互转(1) -- word转html

使用忠告使用该方式进行xhtml到word的转换, 简单转换是可以, 但是可能并没有想象中那么满意, 转换出来的word格式并不完美, 比如目录和标题都会丢失, 标题显示看起来一样, 但是是用正文加粗和加大字号来显示的. 毕竟word是一种文档格式, 而html是一种标记性语言, 要想实现完美兼…

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

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

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

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

Python学习札记(十七) 高级特性3 列表生成式

参考&#xff1a;列表生成式 Note 1.List Comprehensions&#xff0c;即列表生成式&#xff0c;是Python中内置的非常强大的list生成式。 eg.生成一个列表&#xff1a;[1*1, 2*2, ..., 10*10] 使用for...in的方法&#xff1a; #!/usr/bin/env python3L1 []for i in range(1, 1…

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

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

Java学习之String StringBuffer StringBuilder区别

1.String&#xff1a;对象长度是不可变的&#xff0c;是线程安全。 2.StringBuffer&#xff1a;对象长度是可变的&#xff0c;是线程安全。 3.StringBuilder&#xff1a;对象长度是可变&#xff0c;不是线程安全。转载于:https://www.cnblogs.com/michaelShao/p/6372556.html

计算机找不到管理无线网络,电脑wifi密码忘了 并且找不到管理无线网络该怎么处理?...

电脑能连无线网而不能连有线网怎么办你的网卡的TCP/IP协议&#xff0c;设置了自动获取IP地址&#xff0c;然而你的局域网中不存在可以让你的机器得到IP地址的DHCP服务器。所以你的IP地址没有获取到&#xff0c;当然是受限制或无连接。解决方法是&#xff0c;为每个网卡设置一个…

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