胜多负少

This commit is contained in:
coco
2026-07-15 18:28:01 +08:00
parent 7846a45f2c
commit 6d273b9854
233 changed files with 27258 additions and 0 deletions
@@ -0,0 +1,15 @@
package com.haibin.calendarviewproject;
import org.junit.Test;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
}
}
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.haibin.calendarviewproject">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".meizu.MeiZuActivity" />
<activity android:name=".multi.MultiActivity" />
<activity android:name=".index.IndexActivity" />
<activity android:name=".simple.SimpleActivity" />
<activity android:name=".range.RangeActivity" />
<activity android:name=".colorful.ColorfulActivity" />
<activity android:name=".solay.SolarActivity" />
<activity android:name=".single.SingleActivity" />
<activity android:name=".progress.ProgressActivity" />
<activity android:name=".custom.CustomActivity" />
<activity android:name=".mix.MixActivity" />
<activity android:name=".pager.ViewPagerActivity" />
<activity android:name=".full.FullActivity" />
<activity android:name=".TestActivity" />
<activity android:name=".CalendarActivity" />
</application>
</manifest>
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@@ -0,0 +1,74 @@
package com.haibin.calendarviewproject;
import java.io.Serializable;
/**
* 一个简单的bean
* Created by huanghaibin on 2017/12/4.
*/
@SuppressWarnings("all")
public class Article implements Serializable {
private int id;
private String title;
private String content;
private String imgUrl;
private String desc;
private String date;
private int type;
public int getId() {
return id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
@@ -0,0 +1,138 @@
package com.haibin.calendarviewproject;
import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.haibin.calendarviewproject.group.GroupRecyclerAdapter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 适配器
* Created by huanghaibin on 2017/12/4.
*/
public class ArticleAdapter extends GroupRecyclerAdapter<String, Article> {
private RequestManager mLoader;
public ArticleAdapter(Context context) {
super(context);
mLoader = Glide.with(context.getApplicationContext());
LinkedHashMap<String, List<Article>> map = new LinkedHashMap<>();
List<String> titles = new ArrayList<>();
map.put("今日推荐", create(0));
map.put("每周热点", create(1));
map.put("最高评论", create(2));
titles.add("今日推荐");
titles.add("每周热点");
titles.add("最高评论");
resetGroups(map,titles);
}
@Override
protected RecyclerView.ViewHolder onCreateDefaultViewHolder(ViewGroup parent, int type) {
return new ArticleViewHolder(mInflater.inflate(R.layout.item_list_article, parent, false));
}
@Override
protected void onBindViewHolder(RecyclerView.ViewHolder holder, Article item, int position) {
ArticleViewHolder h = (ArticleViewHolder) holder;
h.mTextTitle.setText(item.getTitle());
h.mTextContent.setText(item.getContent());
mLoader.load(item.getImgUrl())
.into(h.mImageView);
}
private static class ArticleViewHolder extends RecyclerView.ViewHolder {
private TextView mTextTitle,
mTextContent;
private ImageView mImageView;
private ArticleViewHolder(View itemView) {
super(itemView);
mTextTitle = itemView.findViewById(R.id.tv_title);
mTextContent = itemView.findViewById(R.id.tv_content);
mImageView = itemView.findViewById(R.id.imageView);
}
}
private static Article create(String title, String content, String imgUrl) {
Article article = new Article();
article.setTitle(title);
article.setContent(content);
article.setImgUrl(imgUrl);
return article;
}
private static List<Article> create(int p) {
List<Article> list = new ArrayList<>();
if (p == 0) {
list.add(create("新西兰克马德克群岛发生5.7级地震 震源深度10千米",
"#地震快讯#中国地震台网正式测定:12月04日08时08分在克马德克群岛(南纬32.82度,西经178.73度)发生5.7级地震,震源深度10千米。",
"http://cms-bucket.nosdn.127.net/catchpic/2/27/27e2ce7fd02e6c096e21b1689a8a3fe9.jpg?imageView&thumbnail=550x0"));
list.add(create("俄罗斯喊冤不当\"背锅侠\" 俄美陷入\"后真相\"旋涡",
"“差到令人震惊”,但不怪特朗普。俄罗斯总理德米特里·梅德韦杰夫近日在谈到俄美关系时这样说。俄罗斯近来连遭美国“恶毒”指责和西方国家连环出击。一些国际舆论认为,俄罗斯成了“背锅侠”,俄罗斯自己也公开喊冤斥责美国。在俄美你来我往的互掐中,真相似乎变得已不那么重要了。",
"http://cms-bucket.nosdn.127.net/catchpic/c/c8/c8b0685089258b82f3ca1997def78d8d.png?imageView&thumbnail=550x0"));
list.add(create("中企投资巴西获支持 英媒:巴西人感激\"保住饭碗\"",
"参考消息网12月4日报道 英媒称,里约热内卢附近的阿苏港曾被埃克·巴蒂斯塔称为“通往中国的公路”,10多年前,这位现已名誉扫地的巴西前首富创建了这个超级港,大宗商品热潮结束后,他在巴西的商业帝国几乎无一幸存并于2014年破产,但此后至今有一个项目仍蓬勃发展,那就是阿苏港。",
"http://cms-bucket.nosdn.127.net/catchpic/8/8b/8ba2d19b7f63efc5cf714960d5edd2c3.jpg?imageView&thumbnail=550x0"));
list.add(create("美电视台记者因误报有关弗林新闻被停职四周",
"【环球网报道】据俄罗斯卫星网12月3日报道,美国ABC电视台记者布莱恩·罗素因在有关美国总统前国家安全顾问迈克尔·弗林的新闻报道中的失误,临时被停职。",
"http://cms-bucket.nosdn.127.net/5d18566fde70407b9cc3a728822115c320171203133214.jpeg?imageView&thumbnail=550x0"));
list.add(create("预计明年3月上市 曝全新奥迪Q5L无伪谍照",
"随着之前全新一代国产奥迪Q5L在工信部目录亮相,最近曝光的测试车也都基本褪去了伪装,不过正式上市还是要等到2018年3月份。从最新曝光的内饰来看,轴距的加长令后排的空间有着非常明显的提升。",
"http://cms-bucket.nosdn.127.net/eda9ca222352470190c4f0d6b9a8c29420171201160854.jpeg?imageView&thumbnail=550x0"));
} else if (p == 1) {
list.add(create(
"2019年投产 电咖整车生产基地落户浙江绍兴",
"网易汽车11月30日报道 两周前的广州车展上,电咖发布了其首款电动汽车EV10,官方指导价为13.38万-14.18万,扣除补贴后的零售价为5.98万元-6.78万元,性价比很高。抛开车辆本身,引起业界关注的是这家新势力造车企业的几位核心成员,当年上汽大众团队的三位老兵--张海亮、向东平、牛胜福携手用了957天造了一辆可以上市的车。",
"http://cms-bucket.nosdn.127.net/674c392123254bb69bdd9227442965eb20171129203658.jpeg?imageView&thumbnail=550x0"));
list.add(create(
"2017年进入尾声,苹果大笔押注的ARkit还好么?",
"谷歌推出了AR眼镜、ARCore平台和应用在手机上的Project TangoFacebook也上线了AR开发平台和工具。至于苹果,更是把AR当做发展的重中之重。在新品iPhone8和iPhoneX中,后置摄像头专为AR进行校准,前置摄像头还添加了可以带来更好AR效果的深度传感器。",
"http://cms-bucket.nosdn.127.net/catchpic/7/76/76135ac5d3107a1d5ba11a8ee2fc7e27.jpg?imageView&thumbnail=550x0"));
list.add(create(
"亚马逊CTO:我们要让人类成为机器人的中心!",
"那些相信应用下载会让世界变得更美好的智能手机布道者和应用爱好者们,会在AWS re:Invent大会上感到不自在。亚马逊网络服务首席技术官Werner Vogels表示,所有这些都未能实现信息的民主化。",
"http://cms-bucket.nosdn.127.net/ddb758f16a7d4aa3aa422ec385fc3e5020171204081818.jpeg?imageView&thumbnail=550x0"));
list.add(create(
"有特斯拉车主想用免费的充电桩挖矿,但这可能行不通",
"在社交网络 Facebook 上的一个特斯拉车主群组中,有人开脑洞说可以尝试自己组装矿机放在特斯拉后备箱中,接入车载电池的电源,然后将车停到超级充电桩附近,就能用免费获得的电力挖矿了。",
"http://crawl.nosdn.127.net/nbotreplaceimg/4ce9c743e6c02f6777d22278e2ef8bc3/2b33e32532db204fe207693c82719660.jpg"));
} else if (p == 2) {
list.add(create(
"2017年进入尾声,苹果大笔押注的ARkit还好么?",
"谷歌推出了AR眼镜、ARCore平台和应用在手机上的Project TangoFacebook也上线了AR开发平台和工具。至于苹果,更是把AR当做发展的重中之重。在新品iPhone8和iPhoneX中,后置摄像头专为AR进行校准,前置摄像头还添加了可以带来更好AR效果的深度传感器。",
"http://cms-bucket.nosdn.127.net/catchpic/7/76/76135ac5d3107a1d5ba11a8ee2fc7e27.jpg?imageView&thumbnail=550x0"));
list.add(create(
"亚马逊CTO:我们要让人类成为机器人的中心!",
"那些相信应用下载会让世界变得更美好的智能手机布道者和应用爱好者们,会在AWS re:Invent大会上感到不自在。亚马逊网络服务首席技术官Werner Vogels表示,所有这些都未能实现信息的民主化。",
"http://cms-bucket.nosdn.127.net/ddb758f16a7d4aa3aa422ec385fc3e5020171204081818.jpeg?imageView&thumbnail=550x0"));
list.add(create("中企投资巴西获支持 英媒:巴西人感激\"保住饭碗\"",
"参考消息网12月4日报道 英媒称,里约热内卢附近的阿苏港曾被埃克·巴蒂斯塔称为“通往中国的公路”,10多年前,这位现已名誉扫地的巴西前首富创建了这个超级港,大宗商品热潮结束后,他在巴西的商业帝国几乎无一幸存并于2014年破产,但此后至今有一个项目仍蓬勃发展,那就是阿苏港。",
"http://cms-bucket.nosdn.127.net/catchpic/8/8b/8ba2d19b7f63efc5cf714960d5edd2c3.jpg?imageView&thumbnail=550x0"));
list.add(create("美电视台记者因误报有关弗林新闻被停职四周",
"【环球网报道】据俄罗斯卫星网12月3日报道,美国ABC电视台记者布莱恩·罗素因在有关美国总统前国家安全顾问迈克尔·弗林的新闻报道中的失误,临时被停职。",
"http://cms-bucket.nosdn.127.net/5d18566fde70407b9cc3a728822115c320171203133214.jpeg?imageView&thumbnail=550x0"));
list.add(create(
"2019年投产 电咖整车生产基地落户浙江绍兴",
"网易汽车11月30日报道 两周前的广州车展上,电咖发布了其首款电动汽车EV10,官方指导价为13.38万-14.18万,扣除补贴后的零售价为5.98万元-6.78万元,性价比很高。抛开车辆本身,引起业界关注的是这家新势力造车企业的几位核心成员,当年上汽大众团队的三位老兵--张海亮、向东平、牛胜福携手用了957天造了一辆可以上市的车。",
"http://cms-bucket.nosdn.127.net/674c392123254bb69bdd9227442965eb20171129203658.jpeg?imageView&thumbnail=550x0"));
}
return list;
}
}
@@ -0,0 +1,33 @@
package com.haibin.calendarviewproject;
import android.content.Context;
import android.content.Intent;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
/**
* Only calendar
* Created by haibin on 2019/6/12.
*/
public class CalendarActivity extends BaseActivity {
public static void show(Context context) {
context.startActivity(new Intent(context, CalendarActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_calendar;
}
@Override
protected void initView() {
setStatusBarDarkMode();
}
@Override
protected void initData() {
}
}
@@ -0,0 +1,78 @@
package com.haibin.calendarviewproject;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekBar;
/**
* 自定义英文栏
* Created by huanghaibin on 2017/11/30.
*/
public class EnglishWeekBar extends WeekBar {
private int mPreSelectedIndex;
public EnglishWeekBar(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.english_week_bar, this, true);
setBackgroundColor(Color.WHITE);
int padding = dipToPx(context, 10);
setPadding(padding, 0, padding, 0);
}
@Override
protected void onDateSelected(Calendar calendar, int weekStart, boolean isClick) {
getChildAt(mPreSelectedIndex).setSelected(false);
int viewIndex = getViewIndexByCalendar(calendar, weekStart);
getChildAt(viewIndex).setSelected(true);
mPreSelectedIndex = viewIndex;
}
/**
* 当周起始发生变化,使用自定义布局需要重写这个方法,避免出问题
*
* @param weekStart 周起始
*/
@Override
protected void onWeekStartChange(int weekStart) {
for (int i = 0; i < getChildCount(); i++) {
((TextView) getChildAt(i)).setText(getWeekString(i, weekStart));
}
}
/**
* 或者周文本,这个方法仅供父类使用
*
* @param index index
* @param weekStart weekStart
* @return 或者周文本
*/
private String getWeekString(int index, int weekStart) {
String[] weeks = getContext().getResources().getStringArray(R.array.english_week_string_array);
if (weekStart == 1) {
return weeks[index];
}
if (weekStart == 2) {
return weeks[index == 6 ? 0 : index + 1];
}
return weeks[index == 0 ? 6 : index - 1];
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,483 @@
package com.haibin.calendarviewproject;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import androidx.appcompat.app.AlertDialog;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarview.TrunkBranchAnnals;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.custom.CustomActivity;
import com.haibin.calendarviewproject.full.FullActivity;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import com.haibin.calendarviewproject.meizu.MeiZuMonthView;
import com.haibin.calendarviewproject.meizu.MeizuWeekView;
import com.haibin.calendarviewproject.mix.MixActivity;
import com.haibin.calendarviewproject.multi.MultiActivity;
import com.haibin.calendarviewproject.pager.ViewPagerActivity;
import com.haibin.calendarviewproject.progress.ProgressActivity;
import com.haibin.calendarviewproject.range.RangeActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import com.haibin.calendarviewproject.single.SingleActivity;
import com.haibin.calendarviewproject.solay.SolarActivity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnCalendarLongClickListener,
CalendarView.OnMonthChangeListener,
CalendarView.OnYearChangeListener,
CalendarView.OnWeekChangeListener,
CalendarView.OnViewChangeListener,
CalendarView.OnCalendarInterceptListener,
CalendarView.OnYearViewChangeListener,
DialogInterface.OnClickListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
private AlertDialog mMoreDialog;
private AlertDialog mFuncDialog;
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
//mCalendarView.setRange(2018, 7, 1, 2019, 4, 28);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.iv_more).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMoreDialog == null) {
mMoreDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle(R.string.list_dialog_title)
.setItems(R.array.list_dialog_items, MainActivity.this)
.create();
}
mMoreDialog.show();
}
});
final DialogInterface.OnClickListener listener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
mCalendarLayout.expand();
break;
case 1:
boolean result = mCalendarLayout.shrink();
Log.e("shrink", " -- " + result);
break;
case 2:
mCalendarView.scrollToPre(false);
break;
case 3:
mCalendarView.scrollToNext(false);
break;
case 4:
//mCalendarView.scrollToCurrent(true);
mCalendarView.scrollToCalendar(2018, 12, 30);
break;
case 5:
mCalendarView.setRange(2018, 7, 1, 2019, 4, 28);
// mCalendarView.setRange(mCalendarView.getCurYear(), mCalendarView.getCurMonth(), 6,
// mCalendarView.getCurYear(), mCalendarView.getCurMonth(), 23);
break;
case 6:
Log.e("scheme", " " + mCalendarView.getSelectedCalendar().getScheme() + " -- "
+ mCalendarView.getSelectedCalendar().isCurrentDay());
List<Calendar> weekCalendars = mCalendarView.getCurrentWeekCalendars();
for (Calendar calendar : weekCalendars) {
Log.e("onWeekChange", calendar.toString() + " -- " + calendar.getScheme());
}
new AlertDialog.Builder(MainActivity.this)
.setMessage(String.format("Calendar Range: \n%s —— %s",
mCalendarView.getMinRangeCalendar(),
mCalendarView.getMaxRangeCalendar()))
.show();
break;
}
}
};
findViewById(R.id.iv_func).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mFuncDialog == null) {
mFuncDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle(R.string.func_dialog_title)
.setItems(R.array.func_dialog_items, listener)
.create();
}
mFuncDialog.show();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnMonthChangeListener(this);
mCalendarView.setOnCalendarLongClickListener(this, true);
mCalendarView.setOnWeekChangeListener(this);
mCalendarView.setOnYearViewChangeListener(this);
//设置日期拦截事件,仅适用单选模式,当前无效
mCalendarView.setOnCalendarInterceptListener(this);
mCalendarView.setOnViewChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@SuppressWarnings("unused")
@Override
protected void initData() {
final int year = mCalendarView.getCurYear();
final int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
for (int y = 1997; y < 2082; y++) {
for (int m = 1; m <= 12; m++) {
map.put(getSchemeCalendar(y, m, 1, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 1, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 2, 0xFFe69138, "").toString(),
getSchemeCalendar(y, m, 2, 0xFFe69138, ""));
map.put(getSchemeCalendar(y, m, 3, 0xFFdf1356, "").toString(),
getSchemeCalendar(y, m, 3, 0xFFdf1356, ""));
map.put(getSchemeCalendar(y, m, 4, 0xFFaacc44, "").toString(),
getSchemeCalendar(y, m, 4, 0xFFaacc44, ""));
map.put(getSchemeCalendar(y, m, 5, 0xFFbc13f0, "").toString(),
getSchemeCalendar(y, m, 5, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(y, m, 6, 0xFF542261, "").toString(),
getSchemeCalendar(y, m, 6, 0xFF542261, ""));
map.put(getSchemeCalendar(y, m, 7, 0xFF4a4bd2, "").toString(),
getSchemeCalendar(y, m, 7, 0xFF4a4bd2, ""));
map.put(getSchemeCalendar(y, m, 8, 0xFFe69138, "").toString(),
getSchemeCalendar(y, m, 8, 0xFFe69138, ""));
map.put(getSchemeCalendar(y, m, 9, 0xFF542261, "").toString(),
getSchemeCalendar(y, m, 9, 0xFF542261, ""));
map.put(getSchemeCalendar(y, m, 10, 0xFF87af5a, "").toString(),
getSchemeCalendar(y, m, 10, 0xFF87af5a, ""));
map.put(getSchemeCalendar(y, m, 11, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 11, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 12, 0xFFcda1af, "").toString(),
getSchemeCalendar(y, m, 12, 0xFFcda1af, ""));
map.put(getSchemeCalendar(y, m, 13, 0xFF95af1a, "").toString(),
getSchemeCalendar(y, m, 13, 0xFF95af1a, ""));
map.put(getSchemeCalendar(y, m, 14, 0xFF33aadd, "").toString(),
getSchemeCalendar(y, m, 14, 0xFF33aadd, ""));
map.put(getSchemeCalendar(y, m, 15, 0xFF1aff1a, "").toString(),
getSchemeCalendar(y, m, 15, 0xFF1aff1a, ""));
map.put(getSchemeCalendar(y, m, 16, 0xFF22acaf, "").toString(),
getSchemeCalendar(y, m, 16, 0xFF22acaf, ""));
map.put(getSchemeCalendar(y, m, 17, 0xFF99a6fa, "").toString(),
getSchemeCalendar(y, m, 17, 0xFF99a6fa, ""));
map.put(getSchemeCalendar(y, m, 18, 0xFFe69138, "").toString(),
getSchemeCalendar(y, m, 18, 0xFFe69138, ""));
map.put(getSchemeCalendar(y, m, 19, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 19, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 20, 0xFFe69138, "").toString(),
getSchemeCalendar(y, m, 20, 0xFFe69138, ""));
map.put(getSchemeCalendar(y, m, 21, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 21, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 22, 0xFF99a6fa, "").toString(),
getSchemeCalendar(y, m, 22, 0xFF99a6fa, ""));
map.put(getSchemeCalendar(y, m, 23, 0xFF33aadd, "").toString(),
getSchemeCalendar(y, m, 23, 0xFF33aadd, ""));
map.put(getSchemeCalendar(y, m, 24, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 24, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 25, 0xFF1aff1a, "").toString(),
getSchemeCalendar(y, m, 25, 0xFF1aff1a, ""));
map.put(getSchemeCalendar(y, m, 26, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 26, 0xFF40db25, ""));
map.put(getSchemeCalendar(y, m, 27, 0xFF95af1a, "").toString(),
getSchemeCalendar(y, m, 27, 0xFF95af1a, ""));
map.put(getSchemeCalendar(y, m, 28, 0xFF40db25, "").toString(),
getSchemeCalendar(y, m, 28, 0xFF40db25, ""));
}
}
//28560 数据量增长不会影响UI响应速度,请使用这个API替换
mCalendarView.setSchemeDate(map);
//可自行测试性能差距
//mCalendarView.setSchemeDate(schemes);
findViewById(R.id.ll_flyme).setOnClickListener(this);
findViewById(R.id.ll_simple).setOnClickListener(this);
findViewById(R.id.ll_range).setOnClickListener(this);
findViewById(R.id.ll_mix).setOnClickListener(this);
findViewById(R.id.ll_colorful).setOnClickListener(this);
findViewById(R.id.ll_index).setOnClickListener(this);
findViewById(R.id.ll_tab).setOnClickListener(this);
findViewById(R.id.ll_single).setOnClickListener(this);
findViewById(R.id.ll_multi).setOnClickListener(this);
findViewById(R.id.ll_solar_system).setOnClickListener(this);
findViewById(R.id.ll_progress).setOnClickListener(this);
findViewById(R.id.ll_custom).setOnClickListener(this);
findViewById(R.id.ll_full).setOnClickListener(this);
}
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
mCalendarView.setWeekStarWithSun();
break;
case 1:
mCalendarView.setWeekStarWithMon();
break;
case 2:
mCalendarView.setWeekStarWithSat();
break;
case 3:
if (mCalendarView.isSingleSelectMode()) {
mCalendarView.setSelectDefaultMode();
} else {
mCalendarView.setSelectSingleMode();
}
break;
case 4:
mCalendarView.setWeekView(MeizuWeekView.class);
mCalendarView.setMonthView(MeiZuMonthView.class);
mCalendarView.setWeekBar(EnglishWeekBar.class);
break;
case 5:
mCalendarView.setAllMode();
break;
case 6:
mCalendarView.setOnlyCurrentMode();
break;
case 7:
mCalendarView.setFixMode();
break;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
//CalendarActivity.show(this);
break;
case R.id.ll_custom:
CustomActivity.show(this);
break;
case R.id.ll_mix:
MixActivity.show(this);
break;
case R.id.ll_full:
FullActivity.show(this);
break;
case R.id.ll_range:
RangeActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
case R.id.ll_tab:
ViewPagerActivity.show(this);
break;
case R.id.ll_single:
SingleActivity.show(this);
break;
case R.id.ll_multi:
MultiActivity.show(this);
break;
case R.id.ll_solar_system:
SolarActivity.show(this);
break;
case R.id.ll_progress:
ProgressActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色、则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
Toast.makeText(this, String.format("%s : OutOfRange", calendar), Toast.LENGTH_SHORT).show();
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
//Log.e("onDateSelected", " -- " + calendar.getYear() + " -- " + calendar.getMonth() + " -- " + calendar.getDay());
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
if (isClick) {
Toast.makeText(this, getCalendarText(calendar), Toast.LENGTH_SHORT).show();
}
// Log.e("lunar "," -- " + calendar.getLunarCalendar().toString() + "\n" +
// " -- " + calendar.getLunarCalendar().getYear());
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick + " -- " + calendar.getScheme());
Log.e("onDateSelected", " " + mCalendarView.getSelectedCalendar().getScheme() +
" -- " + mCalendarView.getSelectedCalendar().isCurrentDay());
Log.e("干支年纪 ", " -- " + TrunkBranchAnnals.getTrunkBranchYear(calendar.getLunarCalendar().getYear()));
}
@Override
public void onCalendarLongClickOutOfRange(Calendar calendar) {
Toast.makeText(this, String.format("%s : LongClickOutOfRange", calendar), Toast.LENGTH_SHORT).show();
}
@Override
public void onCalendarLongClick(Calendar calendar) {
Toast.makeText(this, "长按不选择日期\n" + getCalendarText(calendar), Toast.LENGTH_SHORT).show();
}
private static String getCalendarText(Calendar calendar) {
return String.format("新历%s \n 农历%s \n 公历节日:%s \n 农历节日:%s \n 节气:%s \n 是否闰月:%s",
calendar.getMonth() + "" + calendar.getDay() + "",
calendar.getLunarCalendar().getMonth() + "" + calendar.getLunarCalendar().getDay() + "",
TextUtils.isEmpty(calendar.getGregorianFestival()) ? "" : calendar.getGregorianFestival(),
TextUtils.isEmpty(calendar.getTraditionFestival()) ? "" : calendar.getTraditionFestival(),
TextUtils.isEmpty(calendar.getSolarTerm()) ? "" : calendar.getSolarTerm(),
calendar.getLeapMonth() == 0 ? "" : String.format("闰%s月", calendar.getLeapMonth()));
}
@SuppressLint("SetTextI18n")
@Override
public void onMonthChange(int year, int month) {
Log.e("onMonthChange", " -- " + year + " -- " + month);
Calendar calendar = mCalendarView.getSelectedCalendar();
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onViewChange(boolean isMonthView) {
Log.e("onViewChange", " --- " + (isMonthView ? "月视图" : "周视图"));
}
@Override
public void onWeekChange(List<Calendar> weekCalendars) {
for (Calendar calendar : weekCalendars) {
Log.e("onWeekChange", calendar.toString());
}
}
@Override
public void onYearViewChange(boolean isClose) {
Log.e("onYearViewChange", "年视图 -- " + (isClose ? "关闭" : "打开"));
}
/**
* 屏蔽某些不可点击的日期,可根据自己的业务自行修改
*
* @param calendar calendar
* @return 是否屏蔽某些不可点击的日期,MonthView和WeekView有类似的API可调用
*/
@Override
public boolean onCalendarIntercept(Calendar calendar) {
Log.e("onCalendarIntercept", calendar.toString());
int day = calendar.getDay();
return day == 1 || day == 3 || day == 6 || day == 11 || day == 12 || day == 15 || day == 20 || day == 26;
}
@Override
public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
Toast.makeText(this, calendar.toString() + "拦截不可点击", Toast.LENGTH_SHORT).show();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
Log.e("onYearChange", " 年份变化 " + year);
}
}
@@ -0,0 +1,51 @@
package com.haibin.calendarviewproject;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
/**
* 测试界面
* Created by huanghaibin on 2018/8/7.
*/
public class TestActivity extends BaseActivity implements View.OnClickListener {
private CalendarView mCalendarView;
public static void show(Context context) {
context.startActivity(new Intent(context, TestActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_test;
}
@Override
protected void initView() {
setStatusBarDarkMode();
findViewById(R.id.iv_next).setOnClickListener(this);
findViewById(R.id.iv_pre).setOnClickListener(this);
mCalendarView = findViewById(R.id.calendar_view);
}
@Override
protected void initData() {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_next:
mCalendarView.scrollToNext(false);
break;
case R.id.iv_pre:
mCalendarView.scrollToPre(false);
break;
}
}
}
@@ -0,0 +1,147 @@
package com.haibin.calendarviewproject.base.activity;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 基类
* Created by huanghaibin on 2017/11/16.
*/
public abstract class BaseActivity extends AppCompatActivity {
private static boolean isMiUi = false;
protected void initWindow() {
}
protected abstract int getLayoutId();
protected abstract void initView();
protected abstract void initData();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initWindow();
setContentView(getLayoutId());
initView();
initData();
}
/**
* 设置小米黑色状态栏字体
*/
@SuppressLint("PrivateApi")
private void setMIUIStatusBarDarkMode() {
if (isMiUi) {
Class<? extends Window> clazz = getWindow().getClass();
try {
int darkModeFlag;
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(getWindow(), darkModeFlag, darkModeFlag);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* 静态域,获取系统版本是否基于MIUI
*/
static {
try {
@SuppressLint("PrivateApi") Class<?> sysClass = Class.forName("android.os.SystemProperties");
Method getStringMethod = sysClass.getDeclaredMethod("get", String.class);
String version = (String) getStringMethod.invoke(sysClass, "ro.miui.ui.version.name");
isMiUi = version.compareTo("V6") >= 0 && Build.VERSION.SDK_INT < 24;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置魅族手机状态栏图标颜色风格
* 可以用来判断是否为Flyme用户
*
* @param window 需要设置的窗口
* @param dark 是否把状态栏字体及图标颜色设置为深色
* @return boolean 成功执行返回true
*/
@SuppressWarnings("JavaReflectionMemberAccess")
public static boolean setMeiZuDarkMode(Window window, boolean dark) {
boolean result = false;
if (Build.VERSION.SDK_INT >= 24) {
return false;
}
if (window != null) {
try {
WindowManager.LayoutParams lp = window.getAttributes();
Field darkFlag = WindowManager.LayoutParams.class
.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
Field meizuFlags = WindowManager.LayoutParams.class
.getDeclaredField("meizuFlags");
darkFlag.setAccessible(true);
meizuFlags.setAccessible(true);
int bit = darkFlag.getInt(null);
int value = meizuFlags.getInt(lp);
if (dark) {
value |= bit;
} else {
value &= ~bit;
}
meizuFlags.setInt(lp, value);
window.setAttributes(lp);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
@SuppressLint("InlinedApi")
private int getStatusBarLightMode() {
int result = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (isMiUi) {
result = 1;
} else if (setMeiZuDarkMode(getWindow(), true)) {
result = 2;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
result = 3;
}
}
return result;
}
@SuppressLint("InlinedApi")
protected void setStatusBarDarkMode() {
int type = getStatusBarLightMode();
if (type == 1) {
setMIUIStatusBarDarkMode();
} else if (type == 2) {
setMeiZuDarkMode(getWindow(), true);
} else if (type == 3) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
}
@@ -0,0 +1,139 @@
/*
* Copyright (C) 2016 huanghaibin_dev <huanghaibin_dev@163.com>
* WebSite https://github.com/MiracleTimes-Dev
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.haibin.calendarviewproject.base.adapter;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* 基本的适配器
*/
@SuppressWarnings("unused")
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter {
protected LayoutInflater mInflater;
protected List<T> mItems;
private OnItemClickListener onItemClickListener;
private OnClickListener onClickListener;
public BaseRecyclerAdapter(Context context) {
this.mItems = new ArrayList<>();
mInflater = LayoutInflater.from(context);
onClickListener = new OnClickListener() {
@Override
public void onClick(int position, long itemId) {
if (onItemClickListener != null)
onItemClickListener.onItemClick(position, itemId);
}
};
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType);
holder.itemView.setTag(holder);
holder.itemView.setOnClickListener(onClickListener);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
onBindViewHolder(holder, mItems.get(position), position);
}
protected abstract RecyclerView.ViewHolder onCreateDefaultViewHolder(ViewGroup parent, int type);
protected abstract void onBindViewHolder(RecyclerView.ViewHolder holder, T item, int position);
@Override
public int getItemCount() {
return mItems.size();
}
void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
void addAll(List<T> items) {
if (items != null && items.size() > 0) {
mItems.addAll(items);
notifyItemRangeInserted(mItems.size(), items.size());
}
}
final void addItem(T item) {
if (item != null) {
this.mItems.add(item);
notifyItemChanged(mItems.size());
}
}
final List<T> getItems() {
return mItems;
}
final T getItem(int position) {
if (position < 0 || position >= mItems.size())
return null;
return mItems.get(position);
}
static abstract class OnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag();
onClick(holder.getAdapterPosition(), holder.getItemId());
}
public abstract void onClick(int position, long itemId);
}
interface OnItemClickListener {
void onItemClick(int position, long itemId);
}
public final void removeItem(T item) {
if (this.mItems.contains(item)) {
int position = mItems.indexOf(item);
this.mItems.remove(item);
notifyItemRemoved(position);
}
}
protected final void removeItem(int position) {
if (this.getItemCount() > position) {
this.mItems.remove(position);
notifyItemRemoved(position);
}
}
protected final void clear(){
mItems.clear();
notifyDataSetChanged();
}
}
@@ -0,0 +1,52 @@
package com.haibin.calendarviewproject.base.fragment;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class BaseFragment extends Fragment {
protected View mRootView;
protected LayoutInflater mInflater;
protected Context mContext;
@Override
public void onAttach(Context context) {
mContext = context;
super.onAttach(context);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRootView != null) {
ViewGroup parent = (ViewGroup) mRootView.getParent();
if (parent != null)
parent.removeView(mRootView);
} else {
mRootView = inflater.inflate(getLayoutId(), container, false);
mInflater = inflater;
initView();
initData();
}
return mRootView;
}
@Override
public void onDetach() {
mContext = null;
super.onDetach();
}
protected abstract int getLayoutId();
protected abstract void initView();
protected abstract void initData();
}
@@ -0,0 +1,94 @@
package com.haibin.calendarviewproject.base.fragment;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentTransaction;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("unused")
public class FragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragment = new ArrayList<>();
private final FragmentManager mFragmentManager;
private boolean mUpdateFlag;
private Fragment mCurFragment;
private String[] mTitles;
public FragmentAdapter(FragmentManager fm) {
super(fm);
this.mFragmentManager = fm;
}
public boolean isUpdateFlag() {
return mUpdateFlag;
}
public void setUpdateFlag(boolean mUpdateFlag) {
this.mUpdateFlag = mUpdateFlag;
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (mUpdateFlag) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
String tag = fragment.getTag();
FragmentTransaction transaction = mFragmentManager.beginTransaction();
transaction.remove(fragment);
fragment = getItem(position);
if (!fragment.isAdded()) {
transaction.add(container.getId(), fragment, tag)
.attach(fragment)
.commitAllowingStateLoss();
}
return fragment;
}
return super.instantiateItem(container, position);
}
public void reset(List<Fragment> fragments) {
mFragment.clear();
mFragment.addAll(fragments);
}
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.setPrimaryItem(container, position, object);
if (object instanceof Fragment) {
mCurFragment = (Fragment) object;
}
}
public Fragment getCurFragment() {
return mCurFragment;
}
public void reset(String[] titles) {
this.mTitles = titles;
}
@Override
public Fragment getItem(int position) {
return mFragment.get(position);
}
@Override
public int getCount() {
return mFragment.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
}
@@ -0,0 +1,185 @@
package com.haibin.calendarviewproject.colorful;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class ColorfulActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, ColorfulActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_colorful;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能,推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色、则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,76 @@
package com.haibin.calendarviewproject.colorful;
import android.content.Context;
import android.graphics.Canvas;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class ColorfulMonthView extends MonthView {
private int mRadius;
public ColorfulMonthView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
}
/**
* 如果需要点击Scheme没有效果,则return true
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return false 则不绘制onDrawScheme,因为这里背景色是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = y - mItemHeight / 8;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint : mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint : mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint : mCurMonthLunarTextPaint);
}
}
}
@@ -0,0 +1,85 @@
package com.haibin.calendarviewproject.colorful;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.view.View;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 多彩周视图
* Created by huanghaibin on 2017/11/29.
*/
public class ColorfulWeekView extends WeekView {
private int mRadius;
public ColorfulWeekView(Context context) {
super(context);
// //兼容硬件加速无效的代码
// setLayerType(View.LAYER_TYPE_SOFTWARE, mSelectedPaint);
// //4.0以上硬件加速会导致无效
// mSelectedPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.SOLID));
//
// setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemePaint);
// mSchemePaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.SOLID));
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
}
/**
* 如果需要点击Scheme没有效果,则return true
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return false 则不绘制onDrawScheme,因为这里背景色是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = -mItemHeight / 8;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint : mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint : mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mSchemeTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint : mCurMonthLunarTextPaint);
}
}
}
@@ -0,0 +1,204 @@
package com.haibin.calendarviewproject.custom;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class CustomActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, CustomActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_custom;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
//mCalendarView.addSchemeDate(getSchemeCalendar(2019, 6, 1, 0xFF40db25, "假"));
// int year = 2019;
// int month = 6;
// Map<String, Calendar> map = new HashMap<>();
// map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "假").toString(),
// getSchemeCalendar(year, month, 3, 0xFF40db25, "假"));
// map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "事").toString(),
// getSchemeCalendar(year, month, 6, 0xFFe69138, "事"));
// map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "议").toString(),
// getSchemeCalendar(year, month, 9, 0xFFdf1356, "议"));
// map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "记").toString(),
// getSchemeCalendar(year, month, 13, 0xFFedc56d, "记"));
// mCalendarView.addSchemeDate(map);
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能,推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
CustomActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色、则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick + " -- " + calendar.getScheme());
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,194 @@
package com.haibin.calendarviewproject.custom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 演示一个变态需求的月视图
* Created by huanghaibin on 2018/2/9.
*/
public class CustomMonthView extends MonthView {
private int mRadius;
/**
* 自定义魅族标记的文本画笔
*/
private Paint mTextPaint = new Paint();
/**
* 24节气画笔
*/
private Paint mSolarTermTextPaint = new Paint();
/**
* 背景圆点
*/
private Paint mPointPaint = new Paint();
/**
* 今天的背景色
*/
private Paint mCurrentDayPaint = new Paint();
/**
* 圆点半径
*/
private float mPointRadius;
private int mPadding;
private float mCircleRadius;
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
private float mSchemeBaseLine;
public CustomMonthView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSolarTermTextPaint.setColor(0xff489dff);
mSolarTermTextPaint.setAntiAlias(true);
mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
mSchemeBasicPaint.setColor(Color.WHITE);
mCurrentDayPaint.setAntiAlias(true);
mCurrentDayPaint.setStyle(Paint.Style.FILL);
mCurrentDayPaint.setColor(0xFFeaeaea);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mPointPaint.setTextAlign(Paint.Align.CENTER);
mPointPaint.setColor(Color.RED);
mCircleRadius = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 3);
mPointRadius = dipToPx(context, 2);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
}
@Override
protected void onPreviewHook() {
mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize());
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
boolean isSelected = isSelected(calendar);
if (isSelected) {
mPointPaint.setColor(Color.WHITE);
} else {
mPointPaint.setColor(Color.GRAY);
}
canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
int top = y - mItemHeight / 6;
if (calendar.isCurrentDay() && !isSelected) {
canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint);
}
if (hasScheme) {
canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, y + mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint);
mTextPaint.setColor(calendar.getSchemeColor());
canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, y + mPadding + mSchemeBaseLine, mTextPaint);
}
//当然可以换成其它对应的画笔就不麻烦
if (calendar.isWeekend() && calendar.isCurrentMonth()) {
mCurMonthTextPaint.setColor(0xFF489dff);
mCurMonthLunarTextPaint.setColor(0xFF489dff);
mSchemeTextPaint.setColor(0xFF489dff);
mSchemeLunarTextPaint.setColor(0xFF489dff);
mOtherMonthLunarTextPaint.setColor(0xFF489dff);
mOtherMonthTextPaint.setColor(0xFF489dff);
} else {
mCurMonthTextPaint.setColor(0xff333333);
mCurMonthLunarTextPaint.setColor(0xffCFCFCF);
mSchemeTextPaint.setColor(0xff333333);
mSchemeLunarTextPaint.setColor(0xffCFCFCF);
mOtherMonthTextPaint.setColor(0xFFe1e1e1);
mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1);
}
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint :
mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,64 @@
package com.haibin.calendarviewproject.custom;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekBar;
import com.haibin.calendarviewproject.R;
/**
* 自定义英文栏
* Created by huanghaibin on 2017/11/30.
*/
public class CustomWeekBar extends WeekBar {
private int mPreSelectedIndex;
public CustomWeekBar(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.custom_week_bar, this, true);
setBackgroundColor(Color.WHITE);
}
@Override
protected void onDateSelected(Calendar calendar, int weekStart, boolean isClick) {
getChildAt(mPreSelectedIndex).setSelected(false);
int viewIndex = getViewIndexByCalendar(calendar, weekStart);
getChildAt(viewIndex).setSelected(true);
mPreSelectedIndex = viewIndex;
}
/**
* 当周起始发生变化使用自定义布局需要重写这个方法避免出问题
*
* @param weekStart 周起始
*/
@Override
protected void onWeekStartChange(int weekStart) {
for (int i = 0; i < getChildCount(); i++) {
((TextView) getChildAt(i)).setText(getWeekString(i, weekStart));
}
}
/**
* 或者周文本这个方法仅供父类使用
* @param index index
* @param weekStart weekStart
* @return 或者周文本
*/
private String getWeekString(int index, int weekStart) {
String[] weeks = getContext().getResources().getStringArray(R.array.chinese_week_string_array);
if (weekStart == 1) {
return weeks[index];
}
if (weekStart == 2) {
return weeks[index == 6 ? 0 : index + 1];
}
return weeks[index == 0 ? 6 : index - 1];
}
}
@@ -0,0 +1,200 @@
package com.haibin.calendarviewproject.custom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 演示一个变态需求的周视图
* Created by huanghaibin on 2018/2/9.
*/
public class CustomWeekView extends WeekView {
private int mRadius;
/**
* 自定义魅族标记的文本画笔
*/
private Paint mTextPaint = new Paint();
/**
* 24节气画笔
*/
private Paint mSolarTermTextPaint = new Paint();
/**
* 背景圆点
*/
private Paint mPointPaint = new Paint();
/**
* 今天的背景色
*/
private Paint mCurrentDayPaint = new Paint();
/**
* 圆点半径
*/
private float mPointRadius;
private int mPadding;
private float mCircleRadius;
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
private float mSchemeBaseLine;
public CustomWeekView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSolarTermTextPaint.setColor(0xff489dff);
mSolarTermTextPaint.setAntiAlias(true);
mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
mSchemeBasicPaint.setColor(Color.WHITE);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mPointPaint.setTextAlign(Paint.Align.CENTER);
mPointPaint.setColor(Color.RED);
mCurrentDayPaint.setAntiAlias(true);
mCurrentDayPaint.setStyle(Paint.Style.FILL);
mCurrentDayPaint.setColor(0xFFeaeaea);
mCircleRadius = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 3);
mPointRadius = dipToPx(context, 2);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
}
@Override
protected void onPreviewHook() {
mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize());
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
boolean isSelected = isSelected(calendar);
if (isSelected) {
mPointPaint.setColor(Color.WHITE);
} else {
mPointPaint.setColor(Color.GRAY);
}
canvas.drawCircle(x + mItemWidth / 2, mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
int top = -mItemHeight / 6;
if (calendar.isCurrentDay() && !isSelected) {
canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint);
}
if(hasScheme){
canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint);
mTextPaint.setColor(calendar.getSchemeColor());
canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, mPadding + mSchemeBaseLine, mTextPaint);
}
if (calendar.isWeekend() && calendar.isCurrentMonth()) {
mCurMonthTextPaint.setColor(0xFF489dff);
mCurMonthLunarTextPaint.setColor(0xFF489dff);
mSchemeTextPaint.setColor(0xFF489dff);
mSchemeLunarTextPaint.setColor(0xFF489dff);
mOtherMonthLunarTextPaint.setColor(0xFF489dff);
mOtherMonthTextPaint.setColor(0xFF489dff);
} else {
mCurMonthTextPaint.setColor(0xff333333);
mCurMonthLunarTextPaint.setColor(0xffCFCFCF);
mSchemeTextPaint.setColor(0xff333333);
mSchemeLunarTextPaint.setColor(0xffCFCFCF);
mOtherMonthTextPaint.setColor(0xFFe1e1e1);
mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1);
}
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint :
calendar.isCurrentMonth() ?
mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,142 @@
/*
* Copyright (C) 2016 huanghaibin_dev <huanghaibin_dev@163.com>
* WebSite https://github.com/MiracleTimes-Dev
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.haibin.calendarviewproject.custom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.YearView;
/**
* 自定义年视图
* Created by huanghaibin on 2018/10/9.
*/
@SuppressWarnings("unused")
public class CustomYearView extends YearView {
private int mTextPadding;
/**
* 闰年字体
*/
private Paint mLeapYearTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CustomYearView(Context context) {
super(context);
mTextPadding = dipToPx(context, 3);
mLeapYearTextPaint.setTextSize(dipToPx(context, 12));
mLeapYearTextPaint.setColor(0xffd1d1d1);
mLeapYearTextPaint.setAntiAlias(true);
mLeapYearTextPaint.setFakeBoldText(true);
}
@Override
protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) {
String text = getContext()
.getResources()
.getStringArray(com.haibin.calendarview.R.array.month_string_array)[month - 1];
canvas.drawText(text,
x + mItemWidth / 2 - mTextPadding,
y + mMonthTextBaseLine,
mMonthTextPaint);
if (month == 2 && isLeapYear(year)) {
float w = getTextWidth(mMonthTextPaint, text);
canvas.drawText("闰年",
x + mItemWidth / 2 - mTextPadding + w + dipToPx(getContext(), 6),
y + mMonthTextBaseLine,
mLeapYearTextPaint);
}
}
private float getTextWidth(Paint paint, String text) {
return paint.measureText(text);
}
/**
* 是否是闰年
*
* @param year year
* @return 是否是闰年
*/
private static boolean isLeapYear(int year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
@Override
protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) {
String text = getContext().getResources().getStringArray(com.haibin.calendarview.R.array.year_view_week_string_array)[week];
canvas.drawText(text,
x + width / 2,
y + mWeekTextBaseLine,
mWeekTextPaint);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
int radius = Math.min(mItemWidth, mItemHeight) / 8 * 5;
canvas.drawCircle(cx, cy, radius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
hasScheme ? mSchemeTextPaint : mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint : mSchemeTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint : mCurMonthTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,175 @@
package com.haibin.calendarviewproject.full;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.custom.CustomActivity;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
/**
* 全屏日历,因为月份大小不同的关系需要 app:month_view_show_mode="mode_all"
* 一般地既然使用全屏日历那也不必要
* Created by huanghaibin on 2019/3/7.
*/
public class FullActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
private int mYear;
CalendarView mCalendarView;
public static void show(Context context) {
context.startActivity(new Intent(context, FullActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_full;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mCalendarView = findViewById(R.id.calendarView);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 22, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 22, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(color, "");
calendar.addScheme(day%2 == 0 ? 0xFF00CD00 : 0xFFD15FEE, "");
calendar.addScheme(day%2 == 0 ? 0xFF660000 : 0xFF4169E1, "");
return calendar;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
CustomActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick + " -- " + calendar.getScheme());
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,142 @@
package com.haibin.calendarviewproject.full;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
import java.util.List;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class FullMonthView extends MonthView {
private Paint mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
public FullMonthView(Context context) {
super(context);
mRectPaint.setStyle(Paint.Style.STROKE);
mRectPaint.setStrokeWidth(dipToPx(context, 0.5f));
mRectPaint.setColor(0x88efefef);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
//兼容硬件加速无效的代码
setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemeBasicPaint);
//4.0以上硬件加速会导致无效
mSelectedPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.SOLID));
}
/**
* 绘制选中的日子
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return true 则绘制onDrawScheme因为这里背景色不是是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
canvas.drawRect(x, y , x + mItemWidth, y + mItemHeight, mSelectedPaint);
return true;
}
/**
* 绘制标记的事件日子
*
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
*/
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
List<Calendar.Scheme> schemes = calendar.getSchemes();
if (schemes == null || schemes.size() == 0) {
return;
}
int space = dipToPx(getContext(), 2);
int indexY = y + mItemHeight - 2 * space;
int sw = dipToPx(getContext(), mItemWidth / 10);
int sh = dipToPx(getContext(), 4);
for (Calendar.Scheme scheme : schemes) {
mSchemePaint.setColor(scheme.getShcemeColor());
canvas.drawRect(x + mItemWidth - sw - 2 * space,
indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint);
indexY = indexY - space -sh;
}
}
/**
* 绘制文本
*
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme 是否是标记的日期
* @param isSelected 是否选中
*/
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
canvas.drawRect(x, y, x + mItemWidth, y + mItemHeight, mRectPaint);
int cx = x + mItemWidth / 2;
int top = y - mItemHeight / 6;
boolean isInRange = isInRange(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,119 @@
package com.haibin.calendarviewproject.full;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
import java.util.List;
/**
* 魅族周视图
* Created by huanghaibin on 2017/11/29.
*/
public class FullWeekView extends WeekView {
private Paint mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint mSchemeBasicPaint = new Paint();
public FullWeekView(Context context) {
super(context);
mRectPaint.setStyle(Paint.Style.STROKE);
mRectPaint.setStrokeWidth(dipToPx(context, 0.5f));
mRectPaint.setColor(0x88efefef);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setColor(0xffed5353);
mSchemeBasicPaint.setFakeBoldText(true);
//兼容硬件加速无效的代码
setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemeBasicPaint);
//4.0以上硬件加速会导致无效
mSelectedPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.SOLID));
}
/**
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return true 则绘制onDrawScheme因为这里背景色不是是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
mSelectedPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(x,0, x + mItemWidth, mItemHeight , mSelectedPaint);
return true;
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
List<Calendar.Scheme> schemes = calendar.getSchemes();
if (schemes == null || schemes.size() == 0) {
return;
}
int space = dipToPx(getContext(), 2);
int indexY = mItemHeight - 2 * space;
int sw = dipToPx(getContext(), mItemWidth / 10);
int sh = dipToPx(getContext(), 4);
for (Calendar.Scheme scheme : schemes) {
mSchemePaint.setColor(scheme.getShcemeColor());
canvas.drawRect(x + mItemWidth - sw - 2 * space,
indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint);
indexY = indexY - space -sh;
}
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
canvas.drawRect(x, 0, x + mItemWidth, mItemHeight, mRectPaint);
int cx = x + mItemWidth / 2;
int top = - mItemHeight / 6;
boolean isInRange = isInRange(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,282 @@
package com.haibin.calendarviewproject.group;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import java.util.HashMap;
import java.util.Map;
/**
* 分组浮动的ItemDecoration
* Created by haibin on 2017/5/15.
*/
@SuppressWarnings("all")
public class GroupItemDecoration<Group, Child> extends RecyclerView.ItemDecoration {
protected int mGroupHeight;
protected int mGroutBackground;
protected Paint mBackgroundPaint;
protected Paint mTextPaint;
protected float mTextBaseLine;
protected int mPaddingLeft, mPaddingRight;
protected boolean isCenter;
protected boolean isHasHeader;
protected int mChildItemOffset;
@SuppressLint("UseSparseArrays")
protected Map<Integer, Group> mGroup = new HashMap<>();
public GroupItemDecoration() {
super();
init();
}
private void init() {
mBackgroundPaint = new Paint();
mBackgroundPaint.setColor(0xFFf5f7f8);
mBackgroundPaint.setStyle(Paint.Style.FILL);
mBackgroundPaint.setAntiAlias(true);
mTextPaint = new Paint();
mTextPaint.setColor(0xFF353535);
mTextPaint.setAntiAlias(true);
}
/**
* 先于RecyclerView的Item onDraw调用
*
* @param c RecyclerView canvas
* @param parent RecyclerView
* @param state stare
*/
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
onDrawGroup(c, parent);
}
/**
* 绘制分组Group
*
* @param c Canvas
* @param parent RecyclerView
*/
protected void onDrawGroup(Canvas c, RecyclerView parent) {
int paddingLeft = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int top, bottom;
int count = parent.getChildCount();
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int key = params.getViewLayoutPosition();
if (mGroup.containsKey(key)) {
top = child.getTop() - params.topMargin - mGroupHeight;
bottom = top + mGroupHeight;
c.drawRect(paddingLeft, top, right, bottom, mBackgroundPaint);
String group = mGroup.get(params.getViewLayoutPosition()).toString();
float x;
float y = top + mTextBaseLine;
if (isCenter) {
x = parent.getMeasuredWidth() / 2 - getTextX(group);
} else {
x = mPaddingLeft;
}
c.drawText(group, x, y, mTextPaint);
}
}
}
/**
* 后于RecyclerView的Item onDraw调用
*
* @param c RecyclerView canvas
* @param parent RecyclerView
* @param state stare
*/
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
onDrawOverGroup(c, parent);
}
/**
* 绘制悬浮组
*
* @param c Canvas
* @param parent RecyclerView
*/
protected void onDrawOverGroup(Canvas c, RecyclerView parent) {
int firstVisiblePosition = ((LinearLayoutManager) parent.getLayoutManager()).findFirstVisibleItemPosition();
if (firstVisiblePosition == RecyclerView.NO_POSITION) {
return;
}
Group group = getCroup(firstVisiblePosition);
if (group == null)
return;
String groupTitle = group.toString();
if (TextUtils.isEmpty(groupTitle)) {
return;
}
boolean isRestore = false;
Group nextGroup = getCroup(firstVisiblePosition + 1);
if (nextGroup != null && !group.equals(nextGroup)) {
//说明是当前组最后一个元素但不一定碰撞了
View child = parent.findViewHolderForAdapterPosition(firstVisiblePosition).itemView;
if (child.getTop() + child.getMeasuredHeight() < mGroupHeight) {
//进一步检测碰撞
c.save();//保存画布当前的状态
isRestore = true;
c.translate(0, child.getTop() + child.getMeasuredHeight() - mGroupHeight);
}
}
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int top = parent.getPaddingTop();
int bottom = top + mGroupHeight;
c.drawRect(left, top, right, bottom, mBackgroundPaint);
float x;
float y = top + mTextBaseLine;
if (isCenter) {
x = parent.getMeasuredWidth() / 2 - getTextX(groupTitle);
} else {
x = mPaddingLeft;
}
c.drawText(groupTitle, x, y, mTextPaint);
if (isRestore) {
//还原画布为初始状态
c.restore();
}
}
/**
* 设置item的上下左右偏移量
*
* @param outRect rect
* @param view item
* @param parent RecyclerView
* @param state stare
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
getItemOffsets(outRect, view, parent, parent.getChildViewHolder(view).getAdapterPosition());
}
/**
* 设置item的上下左右偏移量不做任何处理就是默认状态
*
* @param outRect outRect
* @param view view
* @param parent RecyclerView
* @param adapterPosition position
*/
protected void getItemOffsets(Rect outRect, View view, RecyclerView parent, int adapterPosition) {
if (mGroup.containsKey(adapterPosition)) {
outRect.set(0, mGroupHeight, 0, mGroup.containsKey(adapterPosition + 1) ? 0 : mChildItemOffset);
} else {
outRect.set(0, 0, 0, mGroup.containsKey(adapterPosition + 1) ? 0 : mChildItemOffset);
}
}
/**
* 获得当前ViewPosition所在的组
*
* @param position 当前View的position
* @return 当前ViewPosition所在的组
*/
protected Group getCroup(int position) {
while (position >= 0) {
if (mGroup.containsKey(position)) {
return mGroup.get(position);
}
position--;
}
return null;
}
/**
* 通知更新分组信息
*
* @param adapter GroupRecyclerAdapter
*/
public void notifyDataSetChanged(GroupRecyclerAdapter<Group, Child> adapter) {
mGroup.clear();
if (adapter == null) return;
int key = 0;
for (int i = 0; i < adapter.getGroupCount(); i++) {
if (i == 0) {
mGroup.put(isHasHeader ? 1 : 0, adapter.getGroup(i));
key += adapter.getChildCount(i) + (isHasHeader ? 1 : 0);
;
} else {
mGroup.put(key, adapter.getGroup(i));
key += adapter.getChildCount(i);
}
}
}
public void setChildItemOffset(int childItemOffset){
this.mChildItemOffset = childItemOffset;
}
public void setBackground(int groupBackground) {
mBackgroundPaint.setColor(groupBackground);
}
public void setTextColor(int textColor) {
mTextPaint.setColor(textColor);
}
public void setTextSize(float textSize) {
mTextPaint.setTextSize(textSize);
Paint.FontMetrics metrics = mTextPaint.getFontMetrics();
mTextBaseLine = mGroupHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2;
}
public void setGroupHeight(int groupHeight) {
mGroupHeight = groupHeight;
Paint.FontMetrics metrics = mTextPaint.getFontMetrics();
mTextBaseLine = mGroupHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2;
}
public void setPadding(int mPaddingLeft, int mPaddingRight) {
this.mPaddingLeft = mPaddingLeft;
this.mPaddingRight = mPaddingRight;
}
public void setCenter(boolean isCenter) {
this.isCenter = isCenter;
}
public void setHasHeader(boolean hasHeader) {
isHasHeader = hasHeader;
}
/**
* 获取文本的x坐标起点
*
* @param str 文本
* @return x
*/
protected float getTextX(String str) {
Rect bounds = new Rect();
mTextPaint.getTextBounds(str, 0, str.length(), bounds);
return bounds.width() / 2;
}
/**
* 获取文本的长度像素
* @param str 文本
* @return px
*/
protected float getTextLenghtPx(String str) {
Rect bounds = new Rect();
mTextPaint.getTextBounds(str, 0, str.length(), bounds);
return bounds.width();
}
}
@@ -0,0 +1,135 @@
package com.haibin.calendarviewproject.group;
import android.content.Context;
import com.haibin.calendarviewproject.base.adapter.BaseRecyclerAdapter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 分组的RecyclerAdapter
* Created by haibin on 2017/5/15.
*/
@SuppressWarnings("unused")
public abstract class GroupRecyclerAdapter<Parent, Child> extends BaseRecyclerAdapter<Child> {
private LinkedHashMap<Parent, List<Child>> mGroups;
private List<Parent> mGroupTitles;
public GroupRecyclerAdapter(Context context) {
super(context);
mGroups = new LinkedHashMap<>();
mGroupTitles = new ArrayList<>();
}
/**
* 返回特定的标题
*/
Parent getGroup(int groupPosition) {
return mGroupTitles.get(groupPosition);
}
/**
* 获得分组的数量
*
* @return 组的数量
*/
int getGroupCount() {
return mGroupTitles.size();
}
/**
* 获取某一组的数量
*
* @param groupPosition groupPosition
* @return 某一组的数量
*/
int getChildCount(int groupPosition) {
if (mGroupTitles == null || mGroups.size() == 0)
return 0;
if (mGroups.get(mGroupTitles.get(groupPosition)) == null)
return 0;
return mGroups.get(mGroupTitles.get(groupPosition)).size();
}
/**
* 重置分组数据
*
* @param groups groups
* @param titles titles
*/
protected void resetGroups(LinkedHashMap<Parent, List<Child>> groups, List<Parent> titles) {
if (groups == null || titles == null) {
return;
}
mGroups.clear();
mGroupTitles.clear();
mGroups.putAll(groups);
mGroupTitles.addAll(titles);
mItems.clear();
for (Parent key : mGroups.keySet()) {
mItems.addAll(mGroups.get(key));
}
notifyDataSetChanged();
}
/**
* 清除分组数据
*/
public final void clearGroup() {
mGroupTitles.clear();
mGroups.clear();
clear();
}
/**
* 从分组移除数据
*
* @param position 下标
* @return 分组是否为空要移除分组
*/
public boolean removeGroupItem(int position) {
int group = getGroupIndex(position);
removeGroupChildren(group);
int count = getChildCount(group);
removeItem(position);
if (count <= 0) {
mGroupTitles.remove(group);
return true;
}
return false;
}
/**
* 获取所在分组
*
* @param position 下标
* @return 获取所在分组
*/
private int getGroupIndex(int position) {
int count = 0;
if (position <= count)
return 0;
int i = 0;
for (Parent parent : mGroups.keySet()) {
count += mGroups.get(parent).size();
if (position < count) {
return i;
}
i++;
}
return 0;
}
private void removeGroupChildren(int groupPosition) {
if (groupPosition >= mGroupTitles.size())
return;
List<Child> childList = mGroups.get(mGroupTitles.get(groupPosition));
if (childList != null && childList.size() != 0) {
childList.remove(childList.size() - 1);
}
}
}
@@ -0,0 +1,91 @@
package com.haibin.calendarviewproject.group;
import android.content.Context;
import android.content.res.TypedArray;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import com.haibin.calendarviewproject.R;
/**
* 带分组浮动的RecyclerView
* Created by haibin on 2017/5/15.
*/
@SuppressWarnings("all")
public class GroupRecyclerView extends RecyclerView {
private GroupItemDecoration mItemDecoration;
private int mGroupHeight;
private int mGroutBackground, mTextColor;
private int mTextSize;
private int mPaddingLeft, mPaddingRight;
private boolean isCenter;
protected int mChildItemOffset;
private boolean isHasHeader;
private OnGroupChangeListener mListener;
public GroupRecyclerView(Context context) {
super(context);
}
public GroupRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GroupRecyclerView);
mTextSize = array.getDimensionPixelSize(R.styleable.GroupRecyclerView_group_text_size, 16);
mGroupHeight = (int) array.getDimension(R.styleable.GroupRecyclerView_group_height, 52);
mChildItemOffset = (int) array.getDimension(R.styleable.GroupRecyclerView_group_child_offset, 20);
mTextColor = array.getColor(R.styleable.GroupRecyclerView_group_text_color, 0xFFFFFFFF);
mGroutBackground = array.getColor(R.styleable.GroupRecyclerView_group_background, 0x80000000);
isCenter = array.getBoolean(R.styleable.GroupRecyclerView_group_center, false);
isHasHeader = array.getBoolean(R.styleable.GroupRecyclerView_group_has_header, true);
mPaddingLeft = (int) array.getDimension(R.styleable.GroupRecyclerView_group_padding_left, 16);
mPaddingRight = (int) array.getDimension(R.styleable.GroupRecyclerView_group_padding_right, 16);
array.recycle();
}
@Override
public void setAdapter(Adapter adapter) {
if (adapter instanceof GroupRecyclerAdapter) {
super.setAdapter(adapter);
} else {
throw new IllegalStateException("Adapter must instanceof " +
"GroupRecyclerAdapter or extends GroupRecyclerAdapter");
}
}
@Override
public void addItemDecoration(ItemDecoration decor) {
if (decor instanceof GroupItemDecoration)
super.addItemDecoration(decor);
else
throw new IllegalStateException("ItemDecoration must instanceof " +
"GroupItemDecoration or extends GroupItemDecoration");
mItemDecoration = (GroupItemDecoration) decor;
mItemDecoration.setTextSize(mTextSize);
mItemDecoration.setBackground(mGroutBackground);
mItemDecoration.setTextColor(mTextColor);
mItemDecoration.setGroupHeight(mGroupHeight);
mItemDecoration.setPadding(mPaddingLeft, mPaddingRight);
mItemDecoration.setCenter(isCenter);
mItemDecoration.setHasHeader(isHasHeader);
mItemDecoration.setChildItemOffset(mChildItemOffset);
//mItemDecoration.notifyDataSetChanged((GroupRecyclerAdapter) getAdapter());
}
public void notifyDataSetChanged() {
mItemDecoration.notifyDataSetChanged((GroupRecyclerAdapter) getAdapter());
}
public void setOnGroupChangeListener(OnGroupChangeListener listener) {
this.mListener = listener;
}
/**
* 分组最上面改变通知
*/
public interface OnGroupChangeListener {
void onGroupChange(int groupPosition, String group);
}
}
@@ -0,0 +1,196 @@
package com.haibin.calendarviewproject.index;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class IndexActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnCalendarLongClickListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, IndexActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_index;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnCalendarLongClickListener(this,false);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onCalendarLongClickOutOfRange(Calendar calendar) {
}
@Override
public void onCalendarLongClick(Calendar calendar) {
Log.e("onDateLongClick", " -- " + calendar.getDay() + " -- " + calendar.getMonth());
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,91 @@
package com.haibin.calendarviewproject.index;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 下标标记的日历控件
* Created by huanghaibin on 2017/11/15.
*/
public class IndexMonthView extends MonthView {
private Paint mSchemeBasicPaint = new Paint();
private int mPadding;
private int mH, mW;
public IndexMonthView(Context context) {
super(context);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setColor(0xff333333);
mSchemeBasicPaint.setFakeBoldText(true);
mPadding = dipToPx(getContext(), 4);
mH = dipToPx(getContext(), 2);
mW = dipToPx(getContext(), 8);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
mSelectedPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint);
return true;
}
/**
* onDrawSelected
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
*/
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
canvas.drawRect(x + mItemWidth / 2 - mW / 2,
y + mItemHeight - mH * 2 - mPadding,
x + mItemWidth / 2 + mW / 2,
y + mItemHeight - mH - mPadding, mSchemeBasicPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = y - mItemHeight / 6;
if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,103 @@
package com.haibin.calendarviewproject.index;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 下标周视图
* Created by huanghaibin on 2017/11/29.
*/
public class IndexWeekView extends WeekView {
private Paint mSchemeBasicPaint = new Paint();
private int mPadding;
private int mH, mW;
public IndexWeekView(Context context) {
super(context);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setColor(0xff333333);
mSchemeBasicPaint.setFakeBoldText(true);
mPadding = dipToPx(getContext(), 4);
mH = dipToPx(getContext(), 2);
mW = dipToPx(getContext(), 8);
}
@Override
protected void onPreviewHook() {
}
/**
* 如果这里和 onDrawScheme 是互斥的 return false
* return true 会先绘制 onDrawSelected再绘制onDrawSelected
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param hasScheme hasScheme 非标记的日期
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
mSelectedPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint);
return true;
}
/**
* 绘制下标标记
*
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
*/
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
canvas.drawRect(x + mItemWidth / 2 - mW / 2,
mItemHeight - mH * 2 - mPadding,
x + mItemWidth / 2 + mW / 2,
mItemHeight - mH - mPadding, mSchemeBasicPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = -mItemHeight / 6;
if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mCurMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
mCurMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,171 @@
package com.haibin.calendarviewproject.meizu;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import java.util.HashMap;
import java.util.Map;
public class MeiZuActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, MeiZuActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_meizu;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,141 @@
package com.haibin.calendarviewproject.meizu;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class MeiZuMonthView extends MonthView {
/**
* 自定义魅族标记的文本画笔
*/
private Paint mTextPaint = new Paint();
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
private float mRadio;
private int mPadding;
private float mSchemeBaseLine;
public MeiZuMonthView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
mRadio = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 4);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mRadio - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
// //兼容硬件加速无效的代码
// setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemeBasicPaint);
// //4.0以上硬件加速会导致无效
// mSchemeBasicPaint.setMaskFilter(new BlurMaskFilter(25, BlurMaskFilter.Blur.SOLID));
}
/**
* 绘制选中的日子
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return true 则绘制onDrawScheme因为这里背景色不是是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
mSelectedPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint);
return true;
}
/**
* 绘制标记的事件日子
*
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
*/
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint);
canvas.drawText(calendar.getScheme(),
x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,
y + mPadding + mSchemeBaseLine, mTextPaint);
}
private float getTextWidth(String text) {
return mTextPaint.measureText(text);
}
/**
* 绘制文本
*
* @param canvas canvas
* @param calendar 日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme 是否是标记的日期
* @param isSelected 是否选中
*/
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = y - mItemHeight / 6;
boolean isInRange = isInRange(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,109 @@
package com.haibin.calendarviewproject.meizu;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 魅族周视图
* Created by huanghaibin on 2017/11/29.
*/
public class MeizuWeekView extends WeekView {
private Paint mTextPaint = new Paint();
private Paint mSchemeBasicPaint = new Paint();
private float mRadio;
private int mPadding;
private float mSchemeBaseLine;
public MeizuWeekView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setColor(0xffed5353);
mSchemeBasicPaint.setFakeBoldText(true);
mRadio = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 4);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mRadio - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
}
/**
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return true 则绘制onDrawScheme因为这里背景色不是是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
mSelectedPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
mSchemeBasicPaint.setColor(calendar.getSchemeColor());
canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, mPadding + mRadio, mRadio, mSchemeBasicPaint);
canvas.drawText(calendar.getScheme(),
x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,
mPadding + mSchemeBaseLine, mTextPaint);
}
private float getTextWidth(String text) {
return mTextPaint.measureText(text);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int top = -mItemHeight / 6;
boolean isInRange = isInRange(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mCurMonthLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() && isInRange ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,203 @@
package com.haibin.calendarviewproject.mix;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class MixActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, MixActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_mix;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnClickCalendarPaddingListener(new CalendarView.OnClickCalendarPaddingListener() {
@Override
public void onClickCalendarPadding(float x, float y, boolean isMonthView,
Calendar adjacentCalendar, Object obj) {
Log.e("onClickCalendarPadding", " -- " + x + " " + y + " " + obj + " " + adjacentCalendar);
Toast.makeText(MixActivity.this,
adjacentCalendar.getYear() + "年,第" + obj + "",
Toast.LENGTH_SHORT).show();
}
});
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MixActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick + " -- " + calendar.getScheme());
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,219 @@
package com.haibin.calendarviewproject.mix;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarUtil;
import com.haibin.calendarview.MonthView;
/**
* 演示一个变态需求的月视图
* Created by huanghaibin on 2018/2/9.
*/
public class MixMonthView extends MonthView {
private int mRadius;
/**
* 自定义魅族标记的文本画笔
*/
private Paint mTextPaint = new Paint();
/**
* 24节气画笔
*/
private Paint mSolarTermTextPaint = new Paint();
/**
* 背景圆点
*/
private Paint mPointPaint = new Paint();
/**
* 今天的背景色
*/
private Paint mCurrentDayPaint = new Paint();
/**
* 圆点半径
*/
private float mPointRadius;
private int mPadding;
private float mCircleRadius;
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
private float mSchemeBaseLine;
public MixMonthView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSolarTermTextPaint.setColor(0xff489dff);
mSolarTermTextPaint.setAntiAlias(true);
mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
mSchemeBasicPaint.setColor(Color.WHITE);
mCurrentDayPaint.setAntiAlias(true);
mCurrentDayPaint.setStyle(Paint.Style.FILL);
mCurrentDayPaint.setColor(0xFFeaeaea);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mPointPaint.setTextAlign(Paint.Align.CENTER);
mPointPaint.setColor(Color.RED);
mCircleRadius = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 3);
mPointRadius = dipToPx(context, 2);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
}
@Override
protected void onPreviewHook() {
mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize());
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5;
}
@Override
protected Object getClickCalendarPaddingObject(float x, float y,Calendar adjacentCalendar) {
return CalendarUtil.getWeekCountBetweenBothCalendar(mYear, 1, 1,
mYear, adjacentCalendar.getMonth(), adjacentCalendar.getDay(), getWeekStartWith());
}
@Override
protected void onDraw(Canvas canvas) {
int weekStart = CalendarUtil.getWeekCountBetweenBothCalendar(mYear, 1, 1,
mYear, mMonth, 1, getWeekStartWith());
int weekEnd = CalendarUtil.getWeekCountBetweenBothCalendar(mYear, 1, 1,
mYear, mMonth, CalendarUtil.getMonthDaysCount(mYear, mMonth), getWeekStartWith());
int width = dipToPx(getContext(), 52);//left-padding
int cx = width / 2;
int cy = 0;
for (int w = weekStart; w <= weekEnd; w++) {
canvas.drawText(String.valueOf(w), cx, mTextBaseLine + cy,
mOtherMonthTextPaint);
cy += mItemHeight;
}
super.onDraw(canvas);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
boolean isSelected = isSelected(calendar);
if (isSelected) {
mPointPaint.setColor(Color.WHITE);
} else {
mPointPaint.setColor(Color.GRAY);
}
canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
int top = y - mItemHeight / 6;
if (calendar.isCurrentDay() && !isSelected) {
canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint);
}
if (hasScheme) {
canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, y + mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint);
mTextPaint.setColor(calendar.getSchemeColor());
canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, y + mPadding + mSchemeBaseLine, mTextPaint);
}
//当然可以换成其它对应的画笔就不麻烦
if (calendar.isWeekend() && calendar.isCurrentMonth()) {
mCurMonthTextPaint.setColor(0xFF489dff);
mCurMonthLunarTextPaint.setColor(0xFF489dff);
mSchemeTextPaint.setColor(0xFF489dff);
mSchemeLunarTextPaint.setColor(0xFF489dff);
mOtherMonthLunarTextPaint.setColor(0xFF489dff);
mOtherMonthTextPaint.setColor(0xFF489dff);
} else {
mCurMonthTextPaint.setColor(0xff333333);
mCurMonthLunarTextPaint.setColor(0xffCFCFCF);
mSchemeTextPaint.setColor(0xff333333);
mSchemeLunarTextPaint.setColor(0xffCFCFCF);
mOtherMonthTextPaint.setColor(0xFFe1e1e1);
mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1);
}
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
calendar.isCurrentMonth() ? !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint :
mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,64 @@
package com.haibin.calendarviewproject.mix;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekBar;
import com.haibin.calendarviewproject.R;
/**
* 自定义英文栏
* Created by huanghaibin on 2017/11/30.
*/
public class MixWeekBar extends WeekBar {
private int mPreSelectedIndex;
public MixWeekBar(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.custom_week_bar, this, true);
setBackgroundColor(Color.WHITE);
}
@Override
protected void onDateSelected(Calendar calendar, int weekStart, boolean isClick) {
getChildAt(mPreSelectedIndex).setSelected(false);
int viewIndex = getViewIndexByCalendar(calendar, weekStart);
getChildAt(viewIndex).setSelected(true);
mPreSelectedIndex = viewIndex;
}
/**
* 当周起始发生变化使用自定义布局需要重写这个方法避免出问题
*
* @param weekStart 周起始
*/
@Override
protected void onWeekStartChange(int weekStart) {
for (int i = 0; i < getChildCount(); i++) {
((TextView) getChildAt(i)).setText(getWeekString(i, weekStart));
}
}
/**
* 或者周文本这个方法仅供父类使用
* @param index index
* @param weekStart weekStart
* @return 或者周文本
*/
private String getWeekString(int index, int weekStart) {
String[] weeks = getContext().getResources().getStringArray(R.array.chinese_week_string_array);
if (weekStart == 1) {
return weeks[index];
}
if (weekStart == 2) {
return weeks[index == 6 ? 0 : index + 1];
}
return weeks[index == 0 ? 6 : index - 1];
}
}
@@ -0,0 +1,224 @@
package com.haibin.calendarviewproject.mix;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarUtil;
import com.haibin.calendarview.WeekView;
/**
* 演示一个变态需求的周视图
* Created by huanghaibin on 2018/2/9.
*/
public class MixWeekView extends WeekView {
private int mRadius;
/**
* 自定义魅族标记的文本画笔
*/
private Paint mTextPaint = new Paint();
/**
* 24节气画笔
*/
private Paint mSolarTermTextPaint = new Paint();
/**
* 背景圆点
*/
private Paint mPointPaint = new Paint();
/**
* 今天的背景色
*/
private Paint mCurrentDayPaint = new Paint();
/**
* 圆点半径
*/
private float mPointRadius;
private int mPadding;
private float mCircleRadius;
/**
* 自定义魅族标记的圆形背景
*/
private Paint mSchemeBasicPaint = new Paint();
private float mSchemeBaseLine;
public MixWeekView(Context context) {
super(context);
mTextPaint.setTextSize(dipToPx(context, 8));
mTextPaint.setColor(0xffffffff);
mTextPaint.setAntiAlias(true);
mTextPaint.setFakeBoldText(true);
mSolarTermTextPaint.setColor(0xff489dff);
mSolarTermTextPaint.setAntiAlias(true);
mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setAntiAlias(true);
mSchemeBasicPaint.setStyle(Paint.Style.FILL);
mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
mSchemeBasicPaint.setFakeBoldText(true);
mSchemeBasicPaint.setColor(Color.WHITE);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mPointPaint.setTextAlign(Paint.Align.CENTER);
mPointPaint.setColor(Color.RED);
mCurrentDayPaint.setAntiAlias(true);
mCurrentDayPaint.setStyle(Paint.Style.FILL);
mCurrentDayPaint.setColor(0xFFeaeaea);
mCircleRadius = dipToPx(getContext(), 7);
mPadding = dipToPx(getContext(), 3);
mPointRadius = dipToPx(context, 2);
Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1);
}
@Override
protected void onDraw(Canvas canvas) {
if (mItems == null || mItems.size() == 0) {
return;
}
Calendar calendar = mItems.get(0);
int weekStart = CalendarUtil.getWeekCountBetweenBothCalendar(calendar.getYear(), 1, 1,
calendar.getYear(), calendar.getMonth(), calendar.getDay(), getWeekStartWith());
int width = dipToPx(getContext(), 52);
int cx = width / 2;
int cy = 0;
canvas.drawText(String.valueOf(weekStart), cx, mTextBaseLine + cy,
mOtherMonthTextPaint);
super.onDraw(canvas);
}
@Override
protected Object getClickCalendarPaddingObject(float x, float y, Calendar adjacentCalendar) {
return CalendarUtil.getWeekCountBetweenBothCalendar(adjacentCalendar.getYear(), 1, 1,
adjacentCalendar.getYear(), adjacentCalendar.getMonth(), adjacentCalendar.getDay(), getWeekStartWith());
}
@Override
protected void onPreviewHook() {
mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize());
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
boolean isSelected = isSelected(calendar);
if (isSelected) {
mPointPaint.setColor(Color.WHITE);
} else {
mPointPaint.setColor(Color.GRAY);
}
canvas.drawCircle(x + mItemWidth / 2, mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
}
@SuppressWarnings("IntegerDivisionInFloatingPointContext")
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
int top = -mItemHeight / 6;
if (calendar.isCurrentDay() && !isSelected) {
canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint);
}
if (hasScheme) {
canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint);
mTextPaint.setColor(calendar.getSchemeColor());
canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, mPadding + mSchemeBaseLine, mTextPaint);
}
if (calendar.isWeekend() && calendar.isCurrentMonth()) {
mCurMonthTextPaint.setColor(0xFF489dff);
mCurMonthLunarTextPaint.setColor(0xFF489dff);
mSchemeTextPaint.setColor(0xFF489dff);
mSchemeLunarTextPaint.setColor(0xFF489dff);
mOtherMonthLunarTextPaint.setColor(0xFF489dff);
mOtherMonthTextPaint.setColor(0xFF489dff);
} else {
mCurMonthTextPaint.setColor(0xff333333);
mCurMonthLunarTextPaint.setColor(0xffCFCFCF);
mSchemeTextPaint.setColor(0xff333333);
mSchemeLunarTextPaint.setColor(0xffCFCFCF);
mOtherMonthTextPaint.setColor(0xFFe1e1e1);
mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1);
}
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
mSelectTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
calendar.isCurrentDay() ? mCurDayLunarTextPaint :
!TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint :
calendar.isCurrentMonth() ?
mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,86 @@
package com.haibin.calendarviewproject.multi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MultiMonthView;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class CustomMultiMonthView extends MultiMonthView {
private int mRadius;
public CustomMultiMonthView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme,
boolean isSelectedPre, boolean isSelectedNext) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
if (isSelectedPre) {
if (isSelectedNext) {
canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
} else {//最后一个the last
canvas.drawRect(x, cy - mRadius, cx, cy + mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
} else {
if(isSelectedNext){
canvas.drawRect(cx, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
}
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
//
}
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
boolean isInRange = isInRange(calendar);
boolean isEnable = !onCalendarIntercept(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
}
@@ -0,0 +1,84 @@
package com.haibin.calendarviewproject.multi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MultiWeekView;
/**
* 魅族周视图
* Created by huanghaibin on 2017/11/29.
*/
public class CustomMultiWeekView extends MultiWeekView {
private int mRadius;
public CustomMultiWeekView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme,
boolean isSelectedPre, boolean isSelectedNext) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
if (isSelectedPre) {
if (isSelectedNext) {
canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
} else {//最后一个the last
canvas.drawRect(x, cy - mRadius, cx, cy + mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
} else {
if (isSelectedNext) {
canvas.drawRect(cx, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
}
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine;
int cx = x + mItemWidth / 2;
boolean isInRange = isInRange(calendar);
boolean isEnable = !onCalendarIntercept(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
}
@@ -0,0 +1,246 @@
package com.haibin.calendarviewproject.multi;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import java.util.HashMap;
import java.util.Map;
public class MultiActivity extends BaseActivity implements
CalendarView.OnCalendarMultiSelectListener,
CalendarView.OnCalendarInterceptListener,
CalendarView.OnYearChangeListener,
CalendarView.OnMonthChangeListener,
CalendarView.OnCalendarSelectListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, MultiActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_multi;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
//mCalendarView.setMaxMultiSelectSize(9);
// Calendar calendar = new Calendar();
// calendar.setYear(mCalendarView.getCurYear());
// calendar.setMonth(mCalendarView.getCurMonth());
// calendar.setDay(mCalendarView.getCurDay());
// mCalendarView.putMultiSelect(calendar);
// mCalendarView.removeMultiSelect(calendar);
// mCalendarView.getMultiSelectCalendars();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarMultiSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnCalendarSelectListener(this);
//设置日期拦截事件当前有效
mCalendarView.setOnCalendarInterceptListener(this);
mCalendarView.setOnMonthChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
findViewById(R.id.iv_clear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.clearMultiSelect();
}
});
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onCalendarMultiSelectOutOfRange(Calendar calendar) {
Log.e("OutOfRange", "OutOfRange" + calendar);
}
@Override
public void onMultiSelectOutOfSize(Calendar calendar, int maxSize) {
Toast.makeText(this, "超过最大选择数量 " + maxSize, Toast.LENGTH_SHORT).show();
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarMultiSelect(Calendar calendar, int curSize, int maxSize) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + " -- " + calendar.getScheme());
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
@Override
public void onMonthChange(int year, int month) {
Log.e("onMonthChange", " -- " + year + " -- " + month);
}
/**
* 屏蔽某些不可点击的日期可根据自己的业务自行修改
* calendar > 2018年1月1日 && calendar <= 2020年12月31日
*
* @param calendar calendar
* @return 是否屏蔽某些不可点击的日期MonthView和WeekView有类似的API可调用
*/
@Override
public boolean onCalendarIntercept(Calendar calendar) {
//Log.e("onCalendarIntercept", calendar.toString());
int day = calendar.getDay();
// return day == 1 || day == 3 || day == 6 || day == 11 ||
// day == 12 || day == 15 || day == 20 || day == 26;
// return calendar.hasScheme();
return calendar.getYear()<= mCalendarView.getCurYear() &&
calendar.getMonth() <= mCalendarView.getCurMonth() &&
calendar.getDay() < mCalendarView.getCurDay();
}
@Override
public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
Toast.makeText(this,
calendar.toString() + (isClick ? "拦截不可点击" : "拦截设定为无效日期"),
Toast.LENGTH_SHORT).show();
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick + " -- " + calendar.getScheme());
}
}
@@ -0,0 +1,43 @@
package com.haibin.calendarviewproject.pager;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarviewproject.base.fragment.FragmentAdapter;
/**
* 如果嵌套各种View出现事件冲突可以实现这个方法即可
*/
public class CalendarLinearLayout extends LinearLayout implements CalendarLayout.CalendarScrollView {
private FragmentAdapter mAdapter;
public CalendarLinearLayout(Context context) {
super(context);
}
public CalendarLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
/**
* 如果你想让下拉无效return false
*
* @return isScrollToTop
*/
@Override
public boolean isScrollToTop() {
if(mAdapter == null){
if (getChildCount() > 1 && getChildAt(1) instanceof ViewPager) {
ViewPager viewPager = (ViewPager) getChildAt(1);
mAdapter = (FragmentAdapter) viewPager.getAdapter();
}
}
return mAdapter != null && ((PagerFragment) mAdapter.getCurFragment()).isScrollTop();
}
}
@@ -0,0 +1,43 @@
package com.haibin.calendarviewproject.pager;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.fragment.BaseFragment;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
public class PagerFragment extends BaseFragment {
private GroupRecyclerView mRecyclerView;
static PagerFragment newInstance() {
return new PagerFragment();
}
@Override
protected int getLayoutId() {
return R.layout.fragment_pager;
}
@Override
protected void initView() {
mRecyclerView = mRootView.findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(mContext));
mRecyclerView.notifyDataSetChanged();
}
@Override
protected void initData() {
}
boolean isScrollTop() {
return mRecyclerView != null && mRecyclerView.computeVerticalScrollOffset() == 0;
}
}
@@ -0,0 +1,191 @@
package com.haibin.calendarviewproject.pager;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.google.android.material.tabs.TabLayout;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.base.fragment.FragmentAdapter;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ViewPagerActivity extends BaseActivity implements
View.OnClickListener,
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
public static void show(Context context) {
context.startActivity(new Intent(context, ViewPagerActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_view_pager;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
ViewPager viewPager = findViewById(R.id.viewPager);
TabLayout tabLayout = findViewById(R.id.tabLayout);
FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager());
adapter.reset(new String[]{"热门", "头条", "时尚"});
List<Fragment> fragments = new ArrayList<>();
fragments.add(PagerFragment.newInstance());
fragments.add(PagerFragment.newInstance());
fragments.add(PagerFragment.newInstance());
adapter.reset(fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
}
@@ -0,0 +1,185 @@
package com.haibin.calendarviewproject.progress;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class ProgressActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, ProgressActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_progress;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "20").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, "20"));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "33").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, "33"));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "25").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, "25"));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "50").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, "50"));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "80").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, "80"));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "20").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, "20"));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "70").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, "70"));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "36").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, "36"));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "95").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, "95"));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
ProgressActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,110 @@
package com.haibin.calendarviewproject.progress;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 精美进度风格
* Created by huanghaibin on 2018/2/8.
*/
public class ProgressMonthView extends MonthView {
private Paint mProgressPaint = new Paint();
private Paint mNoneProgressPaint = new Paint();
private int mRadius;
public ProgressMonthView(Context context) {
super(context);
mProgressPaint.setAntiAlias(true);
mProgressPaint.setStyle(Paint.Style.STROKE);
mProgressPaint.setStrokeWidth(dipToPx(context, 2.2f));
mProgressPaint.setColor(0xBBf54a00);
mNoneProgressPaint.setAntiAlias(true);
mNoneProgressPaint.setStyle(Paint.Style.STROKE);
mNoneProgressPaint.setStrokeWidth(dipToPx(context, 2.2f));
mNoneProgressPaint.setColor(0x90CfCfCf);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 4;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
int angle = getAngle(Integer.parseInt(calendar.getScheme()));
RectF progressRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius);
canvas.drawArc(progressRectF, -90, angle, false, mProgressPaint);
RectF noneRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius);
canvas.drawArc(noneRectF, angle - 90, 360 - angle, false, mNoneProgressPaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
/**
* 获取角度
*
* @param progress 进度
* @return 获取角度
*/
private static int getAngle(int progress) {
return (int) (progress * 3.6);
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,109 @@
package com.haibin.calendarviewproject.progress;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 精美进度风格
* Created by huanghaibin on 2018/2/8.
*/
public class ProgressWeekView extends WeekView {
private Paint mProgressPaint = new Paint();
private Paint mNoneProgressPaint = new Paint();
private int mRadius;
public ProgressWeekView(Context context) {
super(context);
mProgressPaint.setAntiAlias(true);
mProgressPaint.setStyle(Paint.Style.STROKE);
mProgressPaint.setStrokeWidth(dipToPx(context, 2.2f));
mProgressPaint.setColor(0xBBf54a00);
mNoneProgressPaint.setAntiAlias(true);
mNoneProgressPaint.setStyle(Paint.Style.STROKE);
mNoneProgressPaint.setStrokeWidth(dipToPx(context, 2.2f));
mNoneProgressPaint.setColor(0x90CfCfCf);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 4;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
int angle = getAngle(Integer.parseInt(calendar.getScheme()));
RectF progressRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius);
canvas.drawArc(progressRectF, -90, angle, false, mProgressPaint);
RectF noneRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius);
canvas.drawArc(noneRectF, angle - 90, 360 - angle, false, mNoneProgressPaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
/**
* 获取角度
*
* @param progress 进度
* @return 获取角度
*/
private static int getAngle(int progress) {
return (int) (progress * 3.6);
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
@SuppressWarnings("all")
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,86 @@
package com.haibin.calendarviewproject.range;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.RangeMonthView;
/**
* 范围选择月视图
* Created by huanghaibin on 2018/9/13.
*/
public class CustomRangeMonthView extends RangeMonthView {
private int mRadius;
public CustomRangeMonthView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme,
boolean isSelectedPre, boolean isSelectedNext) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
if (isSelectedPre) {
if (isSelectedNext) {
canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
} else {//最后一个the last
canvas.drawRect(x, cy - mRadius, cx, cy + mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
} else {
if(isSelectedNext){
canvas.drawRect(cx, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
}
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
//
}
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
boolean isInRange = isInRange(calendar);
boolean isEnable = !onCalendarIntercept(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
}
@@ -0,0 +1,84 @@
package com.haibin.calendarviewproject.range;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.RangeWeekView;
/**
* 范围选择周视图
* Created by huanghaibin on 2018/9/13.
*/
public class CustomRangeWeekView extends RangeWeekView {
private int mRadius;
public CustomRangeWeekView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme,
boolean isSelectedPre, boolean isSelectedNext) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
if (isSelectedPre) {
if (isSelectedNext) {
canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
} else {//最后一个the last
canvas.drawRect(x, cy - mRadius, cx, cy + mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
} else {
if (isSelectedNext) {
canvas.drawRect(cx, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint);
}
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
}
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine;
int cx = x + mItemWidth / 2;
boolean isInRange = isInRange(calendar);
boolean isEnable = !onCalendarIntercept(calendar);
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() && isInRange && isEnable? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
}
@@ -0,0 +1,252 @@
package com.haibin.calendarviewproject.range;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RangeActivity extends BaseActivity implements
CalendarView.OnCalendarInterceptListener,
CalendarView.OnCalendarRangeSelectListener,
CalendarView.OnMonthChangeListener,
View.OnClickListener {
TextView mTextLeftDate;
TextView mTextLeftWeek;
TextView mTextRightDate;
TextView mTextRightWeek;
TextView mTextMinRange;
TextView mTextMaxRange;
CalendarView mCalendarView;
private int mCalendarHeight;
public static void show(Context context) {
context.startActivity(new Intent(context, RangeActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_range;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextLeftDate = findViewById(R.id.tv_left_date);
mTextLeftWeek = findViewById(R.id.tv_left_week);
mTextRightDate = findViewById(R.id.tv_right_date);
mTextRightWeek = findViewById(R.id.tv_right_week);
mTextMinRange = findViewById(R.id.tv_min_range);
mTextMaxRange = findViewById(R.id.tv_max_range);
mCalendarView = findViewById(R.id.calendarView);
mCalendarView.setOnCalendarRangeSelectListener(this);
mCalendarView.setOnMonthChangeListener(this);
//设置日期拦截事件当前有效
mCalendarView.setOnCalendarInterceptListener(this);
findViewById(R.id.iv_clear).setOnClickListener(this);
findViewById(R.id.iv_reduce).setOnClickListener(this);
findViewById(R.id.iv_increase).setOnClickListener(this);
findViewById(R.id.tv_commit).setOnClickListener(this);
findViewById(R.id.tv_title).setOnClickListener(this);
mCalendarHeight = dipToPx(this, 46);
mCalendarView.setRange(2000, 1, 1,
mCalendarView.getCurYear(), mCalendarView.getCurMonth(), mCalendarView.getCurDay()
);
mCalendarView.post(new Runnable() {
@Override
public void run() {
mCalendarView.scrollToCurrent();
}
});
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mTextMinRange.setText(String.format("min range = %s", mCalendarView.getMinSelectRange()));
mTextMaxRange.setText(String.format("max range = %s", mCalendarView.getMaxSelectRange()));
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
calendar.addScheme(new Calendar.Scheme());
calendar.addScheme(0xFF008800, "");
calendar.addScheme(0xFF008800, "");
return calendar;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_title:
break;
case R.id.iv_clear:
mCalendarView.clearSelectRange();
mTextLeftWeek.setText("开始日期");
mTextRightWeek.setText("结束日期");
mTextLeftDate.setText("");
mTextRightDate.setText("");
//mCalendarView.setSelectCalendarRange(2018,10,13,2018,10,13);
break;
case R.id.iv_reduce:
mCalendarHeight -= dipToPx(this, 8);
if (mCalendarHeight <= dipToPx(this, 46)) {
mCalendarHeight = dipToPx(this, 46);
}
mCalendarView.setCalendarItemHeight(mCalendarHeight);
break;
case R.id.iv_increase:
mCalendarHeight += dipToPx(this, 8);
if (mCalendarHeight >= dipToPx(this, 90)) {
mCalendarHeight = dipToPx(this, 90);
}
mCalendarView.setCalendarItemHeight(mCalendarHeight);
break;
case R.id.tv_commit:
List<Calendar> calendars = mCalendarView.getSelectCalendarRange();
if (calendars == null || calendars.size() == 0) {
return;
}
for (Calendar c : calendars) {
Log.e("SelectCalendarRange", c.toString()
+ " -- " + c.getScheme()
+ " -- " + c.getLunar());
}
Toast.makeText(this, String.format("选择了%s个日期: %s —— %s", calendars.size(),
calendars.get(0).toString(), calendars.get(calendars.size() - 1).toString()),
Toast.LENGTH_SHORT).show();
break;
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 屏蔽某些不可点击的日期可根据自己的业务自行修改
* calendar > 2018年1月1日 && calendar <= 2020年12月31日
*
* @param calendar calendar
* @return 是否屏蔽某些不可点击的日期MonthView和WeekView有类似的API可调用
*/
@Override
public boolean onCalendarIntercept(Calendar calendar) {
return false;
//return calendar.getTimeInMillis()<getCurrentDayMill() ;
}
private long getCurrentDayMill(){
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.set(java.util.Calendar.HOUR,0);
calendar.set(java.util.Calendar.MINUTE,0);
calendar.set(java.util.Calendar.MILLISECOND,0);
return calendar.getTimeInMillis();
}
@Override
public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
Toast.makeText(this,
calendar.toString() + (isClick ? "拦截不可点击" : "拦截设定为无效日期"),
Toast.LENGTH_SHORT).show();
}
@Override
public void onMonthChange(int year, int month) {
Log.e("onMonthChange", " -- " + year + " -- " + month);
}
@Override
public void onCalendarSelectOutOfRange(Calendar calendar) {
// TODO: 2018/9/13 超出范围提示
}
@Override
public void onSelectOutOfRange(Calendar calendar, boolean isOutOfMinRange) {
Toast.makeText(this,
calendar.toString() + (isOutOfMinRange ? "小于最小选择范围" : "超过最大选择范围"),
Toast.LENGTH_SHORT).show();
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarRangeSelect(Calendar calendar, boolean isEnd) {
if (!isEnd) {
mTextLeftDate.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextLeftWeek.setText(WEEK[calendar.getWeek()]);
mTextRightWeek.setText("结束日期");
mTextRightDate.setText("");
} else {
mTextRightDate.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextRightWeek.setText(WEEK[calendar.getWeek()]);
}
}
private static final String[] WEEK = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
}
@@ -0,0 +1,184 @@
package com.haibin.calendarviewproject.simple;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import java.util.HashMap;
import java.util.Map;
public class SimpleActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
GroupRecyclerView mRecyclerView;
private int mYear;
CalendarLayout mCalendarLayout;
public static void show(Context context) {
context.startActivity(new Intent(context, SimpleActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_simple;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnCalendarSelectListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String,Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,72 @@
package com.haibin.calendarviewproject.simple;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class SimpleMonthView extends MonthView {
private int mRadius;
public SimpleMonthView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onLoopStart(int x, int y) {
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
}
@@ -0,0 +1,66 @@
package com.haibin.calendarviewproject.simple;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 简单周视图
* Created by huanghaibin on 2017/11/29.
*/
public class SimpleWeekView extends WeekView {
private int mRadius;
public SimpleWeekView(Context context) {
super(context);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSchemePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mSchemeTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint);
}
}
}
@@ -0,0 +1,238 @@
package com.haibin.calendarviewproject.single;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.meizu.MeiZuActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class SingleActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
CalendarView.OnMonthChangeListener,
CalendarView.OnCalendarInterceptListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, SingleActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_single;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
setStatusBarDarkMode();
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mYear == 0) {
mYear = mCalendarView.getCurYear();
}
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//mCalendarView.clearSingleSelect();
mCalendarView.scrollToCurrent();
Log.e("onDateSelected",
" -- " + mCalendarView.getSelectedCalendar().getScheme() +
" -- " + mCalendarView.getSelectedCalendar().toString() +
" -- " + mCalendarView.getSelectedCalendar().hasScheme());
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mCalendarView.setOnMonthChangeListener(this);
//设置日期拦截事件仅适用单选模式当前有效
mCalendarView.setOnCalendarInterceptListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "").toString(),
getSchemeCalendar(year, month, 3, 0xFF40db25, ""));
map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "").toString(),
getSchemeCalendar(year, month, 6, 0xFFe69138, ""));
map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "").toString(),
getSchemeCalendar(year, month, 9, 0xFFdf1356, ""));
map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 13, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "").toString(),
getSchemeCalendar(year, month, 14, 0xFFedc56d, ""));
map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "").toString(),
getSchemeCalendar(year, month, 15, 0xFFaacc44, ""));
map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "").toString(),
getSchemeCalendar(year, month, 18, 0xFFbc13f0, ""));
map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 25, 0xFF13acf0, ""));
map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "").toString(),
getSchemeCalendar(year, month, 27, 0xFF13acf0, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
MeiZuActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
SingleActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(color);//如果单独标记颜色则会使用这个颜色
calendar.setScheme(text);
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
Log.e("onDateSelected", " -- " + calendar.getYear() +
" -- " + calendar.getMonth() +
" -- " + calendar.getDay() +
" -- " + isClick);
if (!calendar.isAvailable()) {
mTextLunar.setText("");
mTextYear.setText("");
mTextMonthDay.setText("无效日期");
}
}
@Override
public void onMonthChange(int year, int month) {
Log.e("onMonthChange", " -- " + year + " -- " + month);
}
/**
* 屏蔽某些不可点击的日期可根据自己的业务自行修改
* calendar > 2018年1月1日 && calendar <= 2020年12月31日
*
* @param calendar calendar
* @return 是否屏蔽某些不可点击的日期MonthView和WeekView有类似的API可调用
*/
@Override
public boolean onCalendarIntercept(Calendar calendar) {
//Log.e("onCalendarIntercept", calendar.toString());
int day = calendar.getDay();
return day == 1 || day == 3 || day == 6 || day == 11 ||
day == 12 || day == 15 || day == 20 || day == 26;
}
@Override
public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
Toast.makeText(this,
calendar.toString() + (isClick ? "拦截不可点击" : "拦截滚动到无效日期"),
Toast.LENGTH_SHORT).show();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
Log.e("onYearChange", " 年份变化 " + year);
}
}
@@ -0,0 +1,128 @@
package com.haibin.calendarviewproject.single;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
/**
* 高仿魅族日历布局
* Created by huanghaibin on 2017/11/15.
*/
public class SingleMonthView extends MonthView {
private int mRadius;
private Paint mRingPaint = new Paint();
private int mRingRadius;
/**
* 不可用画笔
*/
private Paint mDisablePaint = new Paint();
private int mH;
public SingleMonthView(Context context) {
super(context);
mRingPaint.setAntiAlias(true);
mRingPaint.setColor(mSchemePaint.getColor());
mRingPaint.setStyle(Paint.Style.STROKE);
mRingPaint.setStrokeWidth(dipToPx(context, 1));
setLayerType(View.LAYER_TYPE_SOFTWARE, mRingPaint);
mRingPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.SOLID));
mDisablePaint.setColor(0xFF9f9f9f);
mDisablePaint.setAntiAlias(true);
mDisablePaint.setStrokeWidth(dipToPx(context,2));
mDisablePaint.setFakeBoldText(true);
mH = dipToPx(context, 18);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 6 * 2;
mRingRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSelectTextPaint.setTextSize(dipToPx(getContext(),17));
}
/**
* 如果需要点击Scheme没有效果则return true
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param y 日历Card y起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return false 则不绘制onDrawScheme因为这里背景色是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRingRadius, mRingPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
// int cx = x + mItemWidth / 2;
// int cy = y + mItemHeight / 2;
//canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y - dipToPx(getContext(),1);
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(calendar.isCurrentDay() ? "" : "",
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(calendar.isCurrentDay() ? "" : String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(calendar.isCurrentDay() ? "" : String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
//日期是否可用拦截
if (onCalendarIntercept(calendar)) {
canvas.drawLine(x + mH, y + mH, x + mItemWidth - mH, y + mItemHeight - mH, mDisablePaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,123 @@
package com.haibin.calendarviewproject.single;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
/**
* 多彩周视图
* Created by huanghaibin on 2017/11/29.
*/
public class SingleWeekView extends WeekView {
private int mRadius;
private Paint mRingPaint = new Paint();
private int mRingRadius;
/**
* 不可用画笔
*/
private Paint mDisablePaint = new Paint();
private int mH;
public SingleWeekView(Context context) {
super(context);
mRingPaint.setAntiAlias(true);
mRingPaint.setColor(mSchemePaint.getColor());
mRingPaint.setStyle(Paint.Style.STROKE);
mRingPaint.setStrokeWidth(dipToPx(context, 1));
setLayerType(View.LAYER_TYPE_SOFTWARE, mRingPaint);
mRingPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.SOLID));
mDisablePaint.setColor(0xFF9f9f9f);
mDisablePaint.setAntiAlias(true);
mDisablePaint.setStrokeWidth(dipToPx(context,2));
mDisablePaint.setFakeBoldText(true);
mH = dipToPx(context, 18);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 6 * 2;
mRingRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
mSelectTextPaint.setTextSize(dipToPx(getContext(),17));
}
/**
* 如果需要点击Scheme没有效果则return true
*
* @param canvas canvas
* @param calendar 日历日历calendar
* @param x 日历Card x起点坐标
* @param hasScheme hasScheme 非标记的日期
* @return false 则不绘制onDrawScheme因为这里背景色是互斥的
*/
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
canvas.drawCircle(cx, cy, mRingRadius, mRingPaint);
return true;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
// int cx = x + mItemWidth / 2;
// int cy = mItemHeight / 2;
//canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine - dipToPx(getContext(), 1);
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(calendar.isCurrentDay() ? "" : "",
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(calendar.isCurrentDay() ? "" : String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(calendar.isCurrentDay() ? "" : String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
//日期是否可用拦截
if (onCalendarIntercept(calendar)) {
canvas.drawLine(x + mH, mH, x + mItemWidth - mH, mItemHeight - mH, mDisablePaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,190 @@
package com.haibin.calendarviewproject.solay;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarLayout;
import com.haibin.calendarview.CalendarView;
import com.haibin.calendarviewproject.Article;
import com.haibin.calendarviewproject.ArticleAdapter;
import com.haibin.calendarviewproject.R;
import com.haibin.calendarviewproject.base.activity.BaseActivity;
import com.haibin.calendarviewproject.colorful.ColorfulActivity;
import com.haibin.calendarviewproject.group.GroupItemDecoration;
import com.haibin.calendarviewproject.group.GroupRecyclerView;
import com.haibin.calendarviewproject.index.IndexActivity;
import com.haibin.calendarviewproject.simple.SimpleActivity;
import java.util.HashMap;
import java.util.Map;
public class SolarActivity extends BaseActivity implements
CalendarView.OnCalendarSelectListener,
CalendarView.OnYearChangeListener,
View.OnClickListener {
TextView mTextMonthDay;
TextView mTextYear;
TextView mTextLunar;
TextView mTextCurrentDay;
CalendarView mCalendarView;
RelativeLayout mRelativeTool;
private int mYear;
CalendarLayout mCalendarLayout;
GroupRecyclerView mRecyclerView;
public static void show(Context context) {
context.startActivity(new Intent(context, SolarActivity.class));
}
@Override
protected int getLayoutId() {
return R.layout.activity_solay;
}
@SuppressLint("SetTextI18n")
@Override
protected void initView() {
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setStatusBarColor(getResources().getColor(R.color.solar_background));
}
mTextMonthDay = findViewById(R.id.tv_month_day);
mTextYear = findViewById(R.id.tv_year);
mTextLunar = findViewById(R.id.tv_lunar);
mRelativeTool = findViewById(R.id.rl_tool);
mCalendarView = findViewById(R.id.calendarView);
mTextCurrentDay = findViewById(R.id.tv_current_day);
mTextMonthDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mCalendarLayout.isExpand()) {
mCalendarLayout.expand();
return;
}
mCalendarView.showYearSelectLayout(mYear);
mTextLunar.setVisibility(View.GONE);
mTextYear.setVisibility(View.GONE);
mTextMonthDay.setText(String.valueOf(mYear));
}
});
findViewById(R.id.fl_current).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCalendarView.scrollToCurrent();
}
});
mCalendarLayout = findViewById(R.id.calendarLayout);
mCalendarView.setOnCalendarSelectListener(this);
mCalendarView.setOnYearChangeListener(this);
mTextYear.setText(String.valueOf(mCalendarView.getCurYear()));
mYear = mCalendarView.getCurYear();
mTextMonthDay.setText(mCalendarView.getCurMonth() + "" + mCalendarView.getCurDay() + "");
mTextLunar.setText("今日");
mTextCurrentDay.setText(String.valueOf(mCalendarView.getCurDay()));
}
@Override
protected void initData() {
int year = mCalendarView.getCurYear();
int month = mCalendarView.getCurMonth();
Map<String, Calendar> map = new HashMap<>();
map.put(getSchemeCalendar(year, month, 3, "").toString(),
getSchemeCalendar(year, month, 3, ""));
map.put(getSchemeCalendar(year, month, 6, "").toString(),
getSchemeCalendar(year, month, 6, ""));
map.put(getSchemeCalendar(year, month, 9, "").toString(),
getSchemeCalendar(year, month, 9, ""));
map.put(getSchemeCalendar(year, month, 13, "").toString(),
getSchemeCalendar(year, month, 13, ""));
map.put(getSchemeCalendar(year, month, 14, "").toString(),
getSchemeCalendar(year, month, 14, ""));
map.put(getSchemeCalendar(year, month, 15, "").toString(),
getSchemeCalendar(year, month, 15, ""));
map.put(getSchemeCalendar(year, month, 18, "").toString(),
getSchemeCalendar(year, month, 18, ""));
map.put(getSchemeCalendar(year, month, 25, "").toString(),
getSchemeCalendar(year, month, 25, ""));
map.put(getSchemeCalendar(year, month, 27, "").toString(),
getSchemeCalendar(year, month, 27, ""));
//此方法在巨大的数据量上不影响遍历性能推荐使用
mCalendarView.setSchemeDate(map);
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new GroupItemDecoration<String, Article>());
mRecyclerView.setAdapter(new ArticleAdapter(this));
mRecyclerView.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_flyme:
SolarActivity.show(this);
break;
case R.id.ll_simple:
SimpleActivity.show(this);
break;
case R.id.ll_colorful:
ColorfulActivity.show(this);
break;
case R.id.ll_index:
IndexActivity.show(this);
break;
}
}
private Calendar getSchemeCalendar(int year, int month, int day, String text) {
Calendar calendar = new Calendar();
calendar.setYear(year);
calendar.setMonth(month);
calendar.setDay(day);
calendar.setSchemeColor(Color.WHITE);
calendar.setScheme(text);
calendar.addScheme(0xFFa8b015, "rightTop");
calendar.addScheme(0xFF423cb0, "leftTop");
calendar.addScheme(0xFF643c8c, "bottom");
return calendar;
}
@Override
public void onCalendarOutOfRange(Calendar calendar) {
}
@SuppressLint("SetTextI18n")
@Override
public void onCalendarSelect(Calendar calendar, boolean isClick) {
mTextLunar.setVisibility(View.VISIBLE);
mTextYear.setVisibility(View.VISIBLE);
mTextMonthDay.setText(calendar.getMonth() + "" + calendar.getDay() + "");
mTextYear.setText(String.valueOf(calendar.getYear()));
mTextLunar.setText(calendar.getLunar());
mYear = calendar.getYear();
}
@Override
public void onYearChange(int year) {
mTextMonthDay.setText(String.valueOf(year));
}
}
@@ -0,0 +1,114 @@
package com.haibin.calendarviewproject.solay;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.MonthView;
import java.util.List;
/**
* 精致星系月视图利用三角函数计算坐标
* solar MonthView ,using trigonometric function
* Created by huanghaibin on 2018/2/8.
*/
public class SolarMonthView extends MonthView {
private Paint mPointPaint = new Paint();
private int mRadius;
private int mPointRadius;
public SolarMonthView(Context context) {
super(context);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mSchemePaint.setStyle(Paint.Style.STROKE);
mSchemePaint.setStrokeWidth(dipToPx(context, 1.2f));
mSchemePaint.setColor(0xFFFFFFFF);
mPointRadius = dipToPx(context, 3.6f);
mPointPaint.setColor(Color.RED);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
int cx = x + mItemWidth / 2;
int cy = y + mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
List<Calendar.Scheme> schemes = calendar.getSchemes();
mPointPaint.setColor(schemes.get(0).getShcemeColor());//You can also use three fixed Paint 你也可以使用三个Paint对象
int rightTopX = (int) (cx + mRadius * Math.cos(-10 * Math.PI / 180));
int rightTopY = (int) (cy + mRadius * Math.sin(-10 * Math.PI / 180));
canvas.drawCircle(rightTopX, rightTopY, mPointRadius, mPointPaint);
mPointPaint.setColor(schemes.get(1).getShcemeColor());
int leftTopX = (int) (cx + mRadius * Math.cos(-140 * Math.PI / 180));
int leftTopY = (int) (cy + mRadius * Math.sin(-140 * Math.PI / 180));
canvas.drawCircle(leftTopX, leftTopY, mPointRadius, mPointPaint);
mPointPaint.setColor(schemes.get(2).getShcemeColor());
int bottomX = (int) (cx + mRadius * Math.cos(100 * Math.PI / 180));
int bottomY = (int) (cy + mRadius * Math.sin(100 * Math.PI / 180));
canvas.drawCircle(bottomX, bottomY, mPointRadius, mPointPaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine + y;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,53 @@
package com.haibin.calendarviewproject.solay;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.TextView;
import com.haibin.calendarview.WeekBar;
import com.haibin.calendarviewproject.R;
/**
* 自定义英文栏
* Created by huanghaibin on 2017/11/30.
*/
public class SolarWeekBar extends WeekBar {
public SolarWeekBar(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.solar_week_bar, this, true);
setBackgroundColor(context.getResources().getColor(R.color.solar_background));
}
/**
* 当周起始发生变化使用自定义布局需要重写这个方法避免出问题
*
* @param weekStart 周起始
*/
@Override
protected void onWeekStartChange(int weekStart) {
for (int i = 0; i < getChildCount(); i++) {
((TextView) getChildAt(i)).setText(getWeekString(i, weekStart));
}
}
/**
* 或者周文本这个方法仅供父类使用
*
* @param index index
* @param weekStart weekStart
* @return 或者周文本
*/
private String getWeekString(int index, int weekStart) {
String[] weeks = getContext().getResources().getStringArray(R.array.english_week_string_array);
if (weekStart == 1) {
return weeks[index];
}
if (weekStart == 2) {
return weeks[index == 6 ? 0 : index + 1];
}
return weeks[index == 0 ? 6 : index - 1];
}
}
@@ -0,0 +1,111 @@
package com.haibin.calendarviewproject.solay;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.WeekView;
import java.util.List;
/**
* 精致周视图,using trigonometric function
* Created by huanghaibin on 2018/2/8.
*/
public class SolarWeekView extends WeekView {
private Paint mPointPaint = new Paint();
private int mRadius;
private int mPointRadius;
public SolarWeekView(Context context) {
super(context);
mPointPaint.setAntiAlias(true);
mPointPaint.setStyle(Paint.Style.FILL);
mSchemePaint.setStyle(Paint.Style.STROKE);
mSchemePaint.setStrokeWidth(dipToPx(context, 1.2f));
mSchemePaint.setColor(0xFFFFFFFF);
mPointRadius = dipToPx(context, 3.6f);
mPointPaint.setColor(Color.RED);
}
@Override
protected void onPreviewHook() {
mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
}
@Override
protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
return false;
}
@Override
protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
int cx = x + mItemWidth / 2;
int cy = mItemHeight / 2;
canvas.drawCircle(cx, cy, mRadius, mSchemePaint);
List<Calendar.Scheme> schemes = calendar.getSchemes();
mPointPaint.setColor(schemes.get(0).getShcemeColor());//You can also use three fixed Paint 你也可以使用三个Paint对象
int rightTopX = (int) (cx + mRadius * Math.cos(-10 * Math.PI / 180));
int rightTopY = (int) (cy + mRadius * Math.sin(-10 * Math.PI / 180));
canvas.drawCircle(rightTopX, rightTopY, mPointRadius, mPointPaint);
mPointPaint.setColor(schemes.get(1).getShcemeColor());
int leftTopX = (int) (cx + mRadius * Math.cos(-140 * Math.PI / 180));
int leftTopY = (int) (cy + mRadius * Math.sin(-140 * Math.PI / 180));
canvas.drawCircle(leftTopX, leftTopY, mPointRadius, mPointPaint);
mPointPaint.setColor(schemes.get(2).getShcemeColor());
int bottomX = (int) (cx + mRadius * Math.cos(100 * Math.PI / 180));
int bottomY = (int) (cy + mRadius * Math.sin(100 * Math.PI / 180));
canvas.drawCircle(bottomX, bottomY, mPointRadius, mPointPaint);
}
@Override
protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
float baselineY = mTextBaseLine;
int cx = x + mItemWidth / 2;
if (isSelected) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
mSelectTextPaint);
} else if (hasScheme) {
canvas.drawText(String.valueOf(calendar.getDay()),
cx,
baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mSchemeTextPaint : mSchemeTextPaint);
} else {
canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
calendar.isCurrentDay() ? mCurDayTextPaint :
calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint);
}
}
/**
* dp转px
*
* @param context context
* @param dpValue dp
* @return px
*/
private static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FF0000" android:state_selected="true" />
<item android:color="#A3A3A3" />
</selector>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#d4d4d4" >
<item>
<shape>
<solid android:color="@color/content_background" />
</shape>
</item>
</ripple>
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#d4d4d4" />
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#cfcfcf" />
</shape>
</item>
<item>
<shape>
<solid android:color="#00000000" />
</shape>
</item>
</selector>

Some files were not shown because too many files have changed in this diff Show More