前言

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

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

主要包括两个核心的类,两个定义控件,上面的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,下载源码看看,我就不再献丑了。

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

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

  1. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  2. Android安卓仿IOS音量调节-自定义view系列(4)

    Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...

  3. Android开发介绍(基于Android Studio软件)

    Android开发介绍(基于Android Studio软件) 关于Android开发,笔者走过一些弯路,因此今天总计了有关Android开发的一些内容和心得,希望对大家有所帮助.首先来一张安卓开发者 ...

  4. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)

    一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于Intelli ...

  5. 仿 IOS 桌面图标下载 view

    DownloadLoadingView 项目地址:xiaweizi/DownloadLoadingView  简介:仿 IOS 桌面图标下载 view 更多:作者   提 Bug 标签: 在工作中难免 ...

  6. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建

    一.引言 本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于IntelliJ I ...

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

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

  8. android 高仿ios开关,Android自定义view仿IOS开关效果

    本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在 Android 自带的 ToggleButton 上修改,而是使用 API 提供的 onDraw.onMeasure.Ca ...

  9. android日历窗口实现,基于Android日历及记事功能完整实现.doc

    基于Android日历及记事功能完整实现 <移动通信程序设计> 课程设计 题 目 基于andriod的功能的日历 二O年月日 1概述1 2 总体设计2 3详细设计3 3.1.绘画基础5 3 ...

最新文章

  1. CSDN湘苗培优|保持热情,告别平庸
  2. 招聘 | B站前端架构师(直播)
  3. leetcode算法题--删除链表的节点
  4. Selenium基础知识
  5. numpy练习100道题
  6. uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系
  7. badboy设置中文_[转载]Badboy使用教程
  8. python线程同步
  9. 谷歌地球 hosts文件_NO—谷歌地球===YESgt;gt;GoogleEarth
  10. MyBatis-Plus配置全局sql注入器后,BaseMapper中方法失效
  11. 解决word中公式插入后行间距变大,和文字不统一的问题
  12. 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
  13. 计算机分区的优点,NTFS分区格式的优点及其转换
  14. 【2019.11.27】EM算法详细推导
  15. 读取Excel工具类ExcelUtils
  16. 未来数字科技趋势分析与前沿热点解读
  17. OCA/OCP Oracle 数据库12c考试指南读书笔记:第27章: Duplicating a Database
  18. 【从0到1搭建LoRa物联网】5、国产LoRa终端ASR6505驱动DHT11
  19. 一文看懂主流区块链攻击底层逻辑
  20. Java不免费_Java 11已经不再完全免费,不要陷入Oracle的Java 11陷阱

热门文章

  1. 批处理 java环境_java环境配置简单批处理方法一键OK
  2. 上线到凌晨4点半 pagehelper的bug?
  3. idea创建springboot项目出现的问题
  4. 66-Flutter移动电商实战-会员中心_编写ListTile的通用方法
  5. 重新记录一下微信后台的配置
  6. xss攻击中受影响的是服务器还是客户端,安全测试基础之 XSS
  7. java水印图片_JAVA实用案例之图片水印开发
  8. 过滤器filter,监听器listener
  9. c#打印,输出一句话
  10. 第12章 存储器的保护