Android自定義日歷效果
因為工作功能需求,自定義一個日歷,效果如下,點擊選中日歷

使用github上面一個前輩的框架
implementation 'com.necer.ncalendar:ncalendar:5.0.0' implementation 'com.github.CodingEnding:PopupLayout:v1.0'//poplayout
框架使用基本類型地址,大家可以根據(jù)需要學(xué)習(xí)修改:地址
自定義日歷的xml文件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" tools:context=".CalendarActivity"> <View android:id="@+id/title_bar" android:layout_width="320dp" android:layout_height="40dp" android:background="@drawable/calendar_bg" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/year" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="18dp" android:text="2018" android:textColor="#ffffff" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@id/title_bar" app:layout_constraintStart_toStartOf="@id/title_bar" app:layout_constraintTop_toTopOf="@id/title_bar" /> <TextView android:id="@+id/month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="18dp" android:text="四" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="@id/title_bar" app:layout_constraintEnd_toEndOf="@id/title_bar" app:layout_constraintStart_toStartOf="@id/title_bar" app:layout_constraintTop_toTopOf="@id/title_bar" /> <TextView android:id="@+id/monthName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="月" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="@id/title_bar" app:layout_constraintStart_toEndOf="@id/month" app:layout_constraintTop_toTopOf="@id/title_bar" /> <com.necer.view.WeekBar android:id="@+id/week" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/title_bar" /> <com.necer.calendar.MonthCalendar android:id="@+id/month_calendar" android:layout_width="320dp" android:layout_height="280dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/week" /> <View android:id="@+id/bottom_view" android:layout_width="320dp" android:layout_height="40dp" android:background="@drawable/calendar_bg_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/month_calendar" /> <TextView android:id="@+id/lastYear" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:onClick="lastYear" android:text="上一年" android:textColor="#ffffff" app:layout_constraintBottom_toBottomOf="@id/bottom_view" app:layout_constraintEnd_toStartOf="@id/dividerOne" app:layout_constraintStart_toStartOf="@id/bottom_view" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <View android:id="@+id/dividerOne" android:layout_width="1dp" android:layout_height="40dp" android:background="#ffffff" app:layout_constraintEnd_toStartOf="@id/lastMonth" app:layout_constraintStart_toEndOf="@id/lastYear" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <TextView android:id="@+id/lastMonth" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:onClick="lastMonth" android:text="上個月" android:textColor="#ffffff" app:layout_constraintBottom_toBottomOf="@id/bottom_view" app:layout_constraintEnd_toStartOf="@id/dividerTwo" app:layout_constraintStart_toEndOf="@id/dividerOne" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <View android:id="@+id/dividerTwo" android:layout_width="1dp" android:layout_height="40dp" android:background="#ffffff" app:layout_constraintEnd_toStartOf="@id/nextMonth" app:layout_constraintStart_toEndOf="@id/lastMonth" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <TextView android:id="@+id/nextMonth" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:text="下個月" android:textColor="#ffffff" android:onClick="nextMonth" app:layout_constraintBottom_toBottomOf="@id/bottom_view" app:layout_constraintEnd_toStartOf="@id/dividerThree" app:layout_constraintStart_toEndOf="@id/dividerTwo" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <View android:id="@+id/dividerThree" android:layout_width="1dp" android:layout_height="40dp" android:background="#ffffff" app:layout_constraintEnd_toStartOf="@id/nextYear" app:layout_constraintStart_toEndOf="@id/nextMonth" app:layout_constraintTop_toTopOf="@id/bottom_view" /> <TextView android:id="@+id/nextYear" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:text="下一年" android:textColor="#ffffff" android:onClick="nextYear" app:layout_constraintBottom_toBottomOf="@id/bottom_view" app:layout_constraintEnd_toEndOf="@id/bottom_view" app:layout_constraintStart_toEndOf="@id/dividerThree" app:layout_constraintTop_toTopOf="@id/bottom_view" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity,日歷的功能重寫也是在和這個函數(shù)中
package com.example.calendartest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.codingending.popuplayout.PopupLayout;
import com.necer.calendar.BaseCalendar;
import com.necer.calendar.MonthCalendar;
import com.necer.enumeration.CheckModel;
import com.necer.enumeration.DateChangeBehavior;
import com.necer.listener.OnCalendarChangedListener;
import org.joda.time.LocalDate;
public class MainActivity extends AppCompatActivity {
PopupLayout popupLayout;
View calendarView;
TextView mYear, mMonth, lastYear, nextYear, lastMonth, nextMonth;
MonthCalendar monthCalendar;
int currentYear, currentMonth;
Button intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = findViewById(R.id.intent);
calendarView = View.inflate(this, R.layout.calendar, null);
popupLayout = PopupLayout.init(this, calendarView);
}
public void intent(View view) {
initCalendar();
popupLayout.show(PopupLayout.POSITION_CENTER);
}
public void initCalendar() {
monthCalendar = calendarView.findViewById(R.id.month_calendar);
mYear = calendarView.findViewById(R.id.year);
mMonth = calendarView.findViewById(R.id.month);
lastYear = calendarView.findViewById(R.id.lastYear);
nextYear = calendarView.findViewById(R.id.nextYear);
lastMonth = calendarView.findViewById(R.id.lastMonth);
nextMonth = calendarView.findViewById(R.id.nextMonth);
monthCalendar.setCheckMode(CheckModel.SINGLE_DEFAULT_UNCHECKED);
monthCalendar.setOnCalendarChangedListener(new OnCalendarChangedListener() {
@Override
public void onCalendarChange(BaseCalendar baseCalendar, int year, int month, LocalDate localDate, DateChangeBehavior dateChangeBehavior) {
mYear.setText(String.valueOf(year));
mMonth.setText(String.valueOf(month));
intent.setText(String.valueOf(localDate));
currentYear = year;
currentMonth = month;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
popupLayout.dismiss();
}
},800);
}
});
}
public void lastMonth(View view) {
monthCalendar.toLastPager();
}
public void nextMonth(View view) {
monthCalendar.toNextPager();
}
public void nextYear(View view) {
monthCalendar.jumpDate(currentYear + 1, currentMonth, 1);
}
public void lastYear(View view) {
monthCalendar.jumpDate(currentYear - 1, currentMonth, 1);
}
}
GitHub下載地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義View之簡約風(fēng)歌詞控件實戰(zhàn)指南
一些接觸Android不久的朋友對自定義View都有一絲畏懼感,總感覺這是一個比較高級的技術(shù),但其實自定義View并不復(fù)雜,有時候只需要簡單幾行代碼就可以完成了,這篇文章主要給大家介紹了關(guān)于Android自定義View之簡約風(fēng)歌詞控件的相關(guān)資料,需要的朋友可以參考下2021-07-07
Android 實現(xiàn)仿網(wǎng)絡(luò)直播彈幕功能詳解及實例
這篇文章主要介紹了Android 實現(xiàn)仿網(wǎng)絡(luò)直播彈幕功能詳解的相關(guān)資料,并附實例代碼及實現(xiàn)效果圖,需要的朋友可以參考下2016-11-11
Android 網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽代碼實例(一)
本文給大家介紹Android 網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽代碼實例(一),對android網(wǎng)絡(luò)狀態(tài)監(jiān)聽相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-03-03
Android自定義TextView仿微信朋友圈文字展開全文功能
這篇文章主要為大家詳細(xì)介紹了Android自定義TextView仿微信朋友圈文字展開全文功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
Android使用AndroidUtilCode實現(xiàn)多語言
這篇文章主要為大家介紹了Android使用AndroidUtilCode實現(xiàn)多語言示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
淺談android獲取設(shè)備唯一標(biāo)識完美解決方案
本篇文章主要介紹了淺談android獲取設(shè)備唯一標(biāo)識完美解決方案,具有一定的參考價值,有興趣的可以了解一下2017-08-08
點擊微信內(nèi)網(wǎng)頁a標(biāo)簽直接跳轉(zhuǎn)打開淘寶APP的方法實例
這篇文章主要給大家介紹了關(guān)于如何實現(xiàn)點擊微信內(nèi)網(wǎng)頁a標(biāo)簽直接跳轉(zhuǎn)打開淘寶APP的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-11-11

