国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)可滑動的自定義日歷控件

2019-10-21 21:45:40
字體:
供稿:網(wǎng)友

最近用到的一個日歷控件,記錄下,效果如圖

Android,滑動,日歷控件

代碼下載地址:點擊打開鏈接

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="visible">  <LinearLayout  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:background="@color/bg_gray"  android:orientation="horizontal">   <ImageView   android:id="@+id/prevMonth"   android:layout_width="0dp"   android:layout_height="wrap_content"   android:layout_gravity="center"   android:layout_weight="1"   android:src="@drawable/prev_month" />   <TextView   android:id="@+id/currentMonth"   android:layout_width="0dp"   android:layout_height="35dp"   android:layout_weight="3"   android:gravity="center"   android:text="2016年9月"   android:textColor="@color/black"   android:textSize="18sp" />   <ImageView   android:id="@+id/nextMonth"   android:layout_width="0dp"   android:layout_height="wrap_content"   android:layout_gravity="center"   android:layout_weight="1"   android:src="@drawable/next_month" /> </LinearLayout>  <LinearLayout  android:layout_width="match_parent"  android:layout_height="20dp"  android:background="@color/bg_gray">   <TextView   style="@style/weekName"   android:text="周日"   android:textColor="@color/green" />   <TextView   style="@style/weekName"   android:text="周一" />   <TextView   style="@style/weekName"   android:text="周二" />   <TextView   style="@style/weekName"   android:text="周三" />   <TextView   style="@style/weekName"   android:text="周四" />   <TextView   style="@style/weekName"   android:text="周五" />   <TextView   style="@style/weekName"   android:text="周六"   android:textColor="@color/green" /> </LinearLayout>  <View  android:layout_width="match_parent"  android:layout_height="1dp"  android:background="@color/line" />  <ViewFlipper  android:id="@+id/flipper"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:background="@color/line"  android:padding="1dp" />  <View  android:layout_width="match_parent"  android:layout_height="1dp"  android:background="@color/line" /> </LinearLayout>

日歷PopCalendar.class的代碼

public class PopCalendar extends PopupWindow implements View.OnClickListener { private View contentView; private Context mContext; private WindowManager windowManager; private GestureDetector gestureDetector = null; private CalendarAdapter calV = null; private ViewFlipper flipper = null; private GridView gvCalendar = null; private static int jumpMonth = 0; // 每次滑動,增加或減去一個月,默認(rèn)為0(即顯示當(dāng)前月) private static int jumpYear = 0; // 滑動跨越一年,則增加或者減去一年,默認(rèn)為0(即當(dāng)前年) private int yearC = 0; private int monthC = 0; private int dayC = 0; private String currentDate = ""; //當(dāng)前年月,顯示在日歷頂端 private TextView currentMonthTv; //上個月,下個月的圖標(biāo) private ImageView prevMonthIv; private ImageView nextMonthIv;  public PopCalendar(final Activity context) {  this.mContext = context;  this.windowManager = context.getWindowManager();;  Date date = new Date();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");  currentDate = sdf.format(date); // 當(dāng)期日期  yearC = Integer.parseInt(currentDate.split("-")[0]);  monthC = Integer.parseInt(currentDate.split("-")[1]);  dayC = Integer.parseInt(currentDate.split("-")[2]);  jumpMonth = 0;  jumpYear = 0;   //設(shè)置PopWindow的屬性  LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  contentView = inflater.inflate(R.layout.pop_calendar, null);  this.setContentView(contentView);  this.setWidth(WindowManager.LayoutParams.FILL_PARENT);  this.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);  this.setFocusable(true);  this.setOutsideTouchable(true);  this.update();  ColorDrawable dw = new ColorDrawable(0000000000);  this.setBackgroundDrawable(dw);   currentMonthTv = (TextView) contentView.findViewById(R.id.currentMonth);  prevMonthIv = (ImageView) contentView.findViewById(R.id.prevMonth);  nextMonthIv = (ImageView) contentView.findViewById(R.id.nextMonth);  setListener();   gestureDetector = new GestureDetector(mContext, new MyGestureListener());  flipper = (ViewFlipper) contentView.findViewById(R.id.flipper);  flipper.removeAllViews();  calV = new CalendarAdapter(mContext, mContext.getResources(), jumpMonth, jumpYear, yearC, monthC, dayC);  addGridView();  gvCalendar.setAdapter(calV);  flipper.addView(gvCalendar, 0);  addTextToTopTextView(currentMonthTv); }  private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   if (e1.getX() - e2.getX() > 120) {    // 像左滑動    enterNextMonth();    return true;   } else if (e1.getX() - e2.getX() < -120) {    // 向右滑動    enterPrevMonth();    return true;   }   return false;  } }  /**  * 移動到下一個月  *  */ private void enterNextMonth() {  addGridView(); // 添加一個gridView  jumpMonth++; // 下一個月   calV = new CalendarAdapter(mContext, mContext.getResources(), jumpMonth, jumpYear, yearC, monthC, dayC);  gvCalendar.setAdapter(calV);  addTextToTopTextView(currentMonthTv); // 移動到下一月后,將當(dāng)月顯示在頭標(biāo)題中  flipper.addView(gvCalendar, 1);  flipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_in));  flipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_out));  flipper.showNext();  flipper.removeViewAt(0); }  /**  * 移動到上一個月  *  */ private void enterPrevMonth() {  addGridView(); // 添加一個gridView  jumpMonth--; // 上一個月   calV = new CalendarAdapter(mContext, mContext.getResources(), jumpMonth, jumpYear, yearC, monthC, dayC);  gvCalendar.setAdapter(calV);  addTextToTopTextView(currentMonthTv); // 移動到上一月后,將當(dāng)月顯示在頭標(biāo)題中  flipper.addView(gvCalendar, 1);   flipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_in));  flipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_out));  flipper.showPrevious();  flipper.removeViewAt(0); }  /**  * 添加頭部的年份 閏哪月等信息  * @param view  */ public void addTextToTopTextView(TextView view) {  StringBuffer textDate = new StringBuffer();  textDate.append(calV.getShowYear()).append("年").append(calV.getShowMonth()).append("月").append("/t");  view.setText(textDate); }  private void addGridView() {  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT);  // 取得屏幕的寬度和高度  Display display = windowManager.getDefaultDisplay();  int Width = display.getWidth();  int Height = display.getHeight();  gvCalendar = new GridView(mContext);  gvCalendar.setNumColumns(7);  gvCalendar.setColumnWidth(40);  // gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);  if (Width == 720 && Height == 1280) {   gvCalendar.setColumnWidth(40);  }  gvCalendar.setGravity(Gravity.CENTER_VERTICAL);  gvCalendar.setSelector(new ColorDrawable(Color.TRANSPARENT));  // 去除gridView邊框  gvCalendar.setVerticalSpacing(2);  gvCalendar.setHorizontalSpacing(2);  gvCalendar.setOnTouchListener(new View.OnTouchListener() {   // 將gridView中的觸摸事件回傳給gestureDetector   public boolean onTouch(View v, MotionEvent event) {    // TODO Auto-generated method stub    return PopCalendar.this.gestureDetector.onTouchEvent(event);   }  });   gvCalendar.setOnItemClickListener(new AdapterView.OnItemClickListener() {    @Override   public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {    // TODO Auto-generated method stub    // 點擊任何一個item,得到這個item的日期(排除點擊的是周日到周六(點擊不響應(yīng)))    int startPosition = calV.getStartPosition();    int endPosition = calV.getEndPosition();    if (startPosition <= position + 7 && position <= endPosition - 7) {     String scheduleDay = calV.getDateByClickItem(position); // 這一天的陽歷     String scheduleYear = calV.getShowYear();     String scheduleMonth = calV.getShowMonth();     Toast.makeText(mContext, scheduleYear + "-" + scheduleMonth + "-" + scheduleDay, Toast.LENGTH_SHORT).show();    }   }  });  gvCalendar.setLayoutParams(params); }  private void setListener() {  prevMonthIv.setOnClickListener(this);  nextMonthIv.setOnClickListener(this); }  @Override public void onClick(View v) {  // TODO Auto-generated method stub  switch (v.getId()) {   case R.id.nextMonth: // 下一個月    enterNextMonth();    break;   case R.id.prevMonth: // 上一個月    enterPrevMonth();    break;   default:    break;  } }  /**  * 顯示popWindow  */ public void showPopupWindow(View parent) {  if (!this.isShowing()) {   // 以下拉方式顯示popupwindow   this.showAsDropDown(parent);  } else {   this.dismiss();  } }}

日歷的內(nèi)容是一個GridView,可以自定義類似簽到效果的圖標(biāo)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/bg_gray" >  <TextView  android:id="@+id/tv_text"  android:layout_width="fill_parent"  android:layout_height="30dp"  android:gravity="center" />  <ImageView  android:layout_width="15dp"  android:layout_height="15dp"  android:visibility="invisible"  android:layout_alignParentBottom="true"  android:background="@drawable/pen"  android:layout_alignParentEnd="true"  android:id="@+id/iv_pen" />  </RelativeLayout>

日歷的adapter

public class CalendarAdapter extends BaseAdapter { private boolean isLeapYear = false; // 是否為閏年 private int daysOfMonth = 0; // 某月的天數(shù) private int dayOfWeek = 0; // 具體某一天是星期幾 private int lastDaysOfMonth = 0; // 上一個月的總天數(shù) private Context context; private String[] dayNumber = new String[42]; // 一個gridview中的日期存入此數(shù)組中 private SpecialCalendar sc = null; private Resources res = null;  private String currentYear = ""; private String currentMonth = "";  private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); private int currentFlag = -1; // 用于標(biāo)記當(dāng)天  private String showYear = ""; // 用于在頭部顯示的年份 private String showMonth = ""; // 用于在頭部顯示的月份  // 系統(tǒng)當(dāng)前時間 private String sysDate = ""; private String sys_year = ""; private String sys_month = ""; private String sys_day = ""; public CalendarAdapter() {  Date date = new Date();  sysDate = sdf.format(date); // 當(dāng)期日期  sys_year = sysDate.split("-")[0];  sys_month = sysDate.split("-")[1];  sys_day = sysDate.split("-")[2]; }  public CalendarAdapter(Context context, Resources rs, int jumpMonth, int jumpYear, int year_c, int month_c, int day_c) {  this();  this.context = context;  sc = new SpecialCalendar();  this.res = rs;   int stepYear = year_c + jumpYear;  int stepMonth = month_c + jumpMonth;  if (stepMonth > 0) {   // 往下一個月滑動   if (stepMonth % 12 == 0) {    stepYear = year_c + stepMonth / 12 - 1;    stepMonth = 12;   } else {    stepYear = year_c + stepMonth / 12;    stepMonth = stepMonth % 12;   }  } else {   // 往上一個月滑動   stepYear = year_c - 1 + stepMonth / 12;   stepMonth = stepMonth % 12 + 12;   if (stepMonth % 12 == 0) {    }  }   currentYear = String.valueOf(stepYear); // 得到當(dāng)前的年份  currentMonth = String.valueOf(stepMonth); // 得到本月  // (jumpMonth為滑動的次數(shù),每滑動一次就增加一月或減一月)   getCalendar(Integer.parseInt(currentYear), Integer.parseInt(currentMonth));  }  @Override public int getCount() {  // TODO Auto-generated method stub  return dayNumber.length; }  @Override public Object getItem(int position) {  // TODO Auto-generated method stub  return position; }  @Override public long getItemId(int position) {  // TODO Auto-generated method stub  return position; }  @Override public View getView(int position, View convertView, ViewGroup parent) {   if (convertView == null) {   convertView = LayoutInflater.from(context).inflate(R.layout.calendar_item, null);  }  TextView textView = (TextView) convertView.findViewById(R.id.tv_text);  ImageView ivPen = (ImageView) convertView.findViewById(R.id.iv_pen);  String d = dayNumber[position];   SpannableString sp = new SpannableString(d);  sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  sp.setSpan(new RelativeSizeSpan(1.2f), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   textView.setText(sp);  textView.setTextColor(Color.BLACK);// 字體設(shè)黑  if (position % 7 == 0 || position % 7 == 6) {   // 當(dāng)前月信息顯示   textView.setTextColor(res.getColor(R.color.green));// 周末字體設(shè)綠色  }   if (position >= dayOfWeek && position < daysOfMonth + dayOfWeek    && (Integer.parseInt(sys_month) >= Integer.parseInt(currentMonth)&&Integer.parseInt(sys_year)==Integer.parseInt(currentYear)    ||Integer.parseInt(sys_year)> Integer.parseInt(currentYear))) {   // 當(dāng)前月信息顯示   int a[] = {2, 6, 29};//每個月不標(biāo)記的天數(shù)   for (int i = 0; i < a.length; i++) {    if (position == a[i]+dayOfWeek-1) {     textView.setBackgroundColor(res.getColor(R.color.yellow));//為寫日記日期填充黃色     ivPen.setVisibility(View.INVISIBLE);     break;    } else {     ivPen.setVisibility(View.VISIBLE);    }   }  } else if (position < dayOfWeek || position >= daysOfMonth + dayOfWeek) {   textView.setTextColor(res.getColor(R.color.bg_gray));  }   if (Integer.parseInt(sys_year)==Integer.parseInt(currentYear)    &&Integer.parseInt(sys_month) == Integer.parseInt(currentMonth)&& currentFlag < position) {   // 設(shè)置本月當(dāng)天之后的背景   textView.setBackgroundColor(res.getColor(R.color.bg_gray));//全部填充灰色   ivPen.setVisibility(View.INVISIBLE);  }   if (currentFlag == position) {   //設(shè)置當(dāng)天的背景   textView.setBackgroundColor(res.getColor(R.color.blue));   textView.setTextColor(Color.WHITE);  }  return convertView; }  // 得到某年的某月的天數(shù)且這月的第一天是星期幾 public void getCalendar(int year, int month) {  isLeapYear = sc.isLeapYear(year); // 是否為閏年  daysOfMonth = sc.getDaysOfMonth(isLeapYear, month); // 某月的總天數(shù)  dayOfWeek = sc.getWeekdayOfMonth(year, month); // 某月第一天為星期幾  lastDaysOfMonth = sc.getDaysOfMonth(isLeapYear, month - 1); // 上一個月的總天數(shù)  getWeek(year, month); }  // 將一個月中的每一天的值添加入數(shù)組dayNuber中 private void getWeek(int year, int month) {  int j = 1;  // 得到當(dāng)前月的所有日程日期(這些日期需要標(biāo)記)  for (int i = 0; i < dayNumber.length; i++) {   if (i < dayOfWeek) { // 前一個月    int temp = lastDaysOfMonth - dayOfWeek + 1;    dayNumber[i] = (temp + i) + "" ;   } else if (i < daysOfMonth + dayOfWeek) { // 本月    String day = String.valueOf(i - dayOfWeek + 1); // 得到的日期    dayNumber[i] = i - dayOfWeek + 1 + "";    // 對于當(dāng)前月才去標(biāo)記當(dāng)前日期    if (sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)) {     // 標(biāo)記當(dāng)前日期     currentFlag = i;    }    setShowYear(String.valueOf(year));    setShowMonth(String.valueOf(month));   } else { // 下一個月    dayNumber[i] = j + "";    j++;   }  } }  /**  * 點擊每一個item時返回item中的日期  * @param position  * @return  */ public String getDateByClickItem(int position) {  return dayNumber[position]; }  /**  * 在點擊gridView時,得到這個月中第一天的位置  * @return  */ public int getStartPosition() {  return dayOfWeek + 7; }  /**  * 在點擊gridView時,得到這個月中最后一天的位置  * @return  */ public int getEndPosition() {  return (dayOfWeek + daysOfMonth + 7) - 1; }  public String getShowYear() {  return showYear; }  public void setShowYear(String showYear) {  this.showYear = showYear; }  public String getShowMonth() {  return showMonth; }  public void setShowMonth(String showMonth) {  this.showMonth = showMonth; }}

在MainActivity點擊顯示日歷,可以指定PopWindow在哪一個控件的下方出現(xiàn)

public class MainActivity extends AppCompatActivity {  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   final Button button = (Button)findViewById(R.id.button);  button.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View view) {    PopCalendar popCalendar = new PopCalendar(MainActivity.this);    popCalendar.showPopupWindow(button);   }  }); }}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沾化县| 松桃| 申扎县| 宁明县| 西吉县| 苗栗市| 舟曲县| 新巴尔虎右旗| 凌源市| 明水县| 微山县| 扎囊县| 高陵县| 新野县| 全州县| 邵阳县| 无锡市| 宜兴市| 嫩江县| 台北县| 嘉善县| 宁陕县| 寻乌县| 荣昌县| 曲松县| 大方县| 溧水县| 常州市| 竹溪县| 巴中市| 德阳市| 广德县| 濉溪县| 临潭县| 东源县| 庆元县| 浦城县| 浦城县| 共和县| 中江县| 古丈县|