仿iphone日历控件

        最近做的项目需要写一写日历控件这个东西,起初在网上找一些资料发现很多资料都是比较繁琐复杂,基本都是自定义控件来写的,天知道你即使画出来日历控件,你对于日历本身的判断是很耗费精力的,而且很多的demo我发现根本就不能点击上面的日期,根本就达不到自己的要求。不过后来我在网上下载了一些框架,然后自己对框架进行了很多的改写,最终还是达到了我需要的效果。网上很多的大神啊,写了让我们这些小白看不懂的文章。我只能呵呵一笑,用框架。下面贴出我的效果图。


其实这个实现起来是非常非常的简单的,下面我贴出工程结构图。


实现这个效果有以下几个步骤:

一、首先导入架包,架包下载地址http://download.csdn.net/detail/u014128885/8704433至于导入架包的方法请参考以前写的侧滑效果那个博客吧,网页地址 http://blog.csdn.net/u014128885/article/details/45064967本来不想给demo的,想了一下伸手党们,还是给你们吧demo地 址http://download.csdn.net/detail/u014128885/8704549

二、如果你成功导入架包之后呢,就可以开始编写java代码了。首先我贴出MainActivity的代码:

package com.yuriko.shijian;

import com.pickerview.TimePopupWindow;
import com.pickerview.TimePopupWindow.Type;
import com.yuriko.yurikotest.R;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

public class ShiJianActivity extends Activity{
	private TextView tvShiJian;
	private TimePopupWindow popupWindow;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.shijian);
		tvShiJian=(TextView)findViewById(R.id.tvShiJian);
		//type有五种类型对应的get方法只写了三种,需要的话可以自己写,到时只需要改掉get方法就行
		//改写显示是年月日还是时分秒等。
		popupWindow = new TimePopupWindow(this, Type.DAY_HOUR_MIN);
		//tvShiJian控件获取时间
		tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2());
		//里面的layout是指这个布局文件,需要给布局文件设置id属性,当然这个布局放在哪里要看你怎么放置。
		findViewById(R.id.layout).post(new Runnable() {
			
			@Override
			public void run() {
				//显示该控件
				popupWindow.showAtLocation(findViewById(R.id.layout), Gravity.CENTER, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, null);				
			}
		});
		//注册广播
		registerReceiver(receiver, new IntentFilter(TimePopupWindow.UPDATE_TIME));
	}
	//广播
	BroadcastReceiver receiver = new BroadcastReceiver() {
		
		@Override
		public void onReceive(Context context, Intent intent) {
			if (intent.getAction().equals(TimePopupWindow.UPDATE_TIME)) {
				tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2());
			}
		}
	};
	//回调(直接拷贝即可,注意receiver广播)
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(receiver);
	}
}
三、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/layout" >
    <TextView 
        android:id="@+id/tvShiJian"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"/>

</LinearLayout>
好了这样就能做出那种效果了,可能大家想要那种非滚动的日历控件,这个下次更新吧。

下面我来说说这个框架怎么改写成自己的东西。

其实大家引用这个框架最关键的是popupWindow = new TimePopupWindow(this, Type.DAY_HOUR_MIN);这句代码,这个很关键,没有它你什么都不能做到,当我们点击进去的时候会看到一个枚举,这个枚举就决定了你可以使用多少个类型。类型可以自己去定义。下面我来教大家如何定义这个枚举。

  1、首先肯定要在这个枚举里面添加你想要的字段,字段的名称随便自己取,但是最好是通俗易懂的。

2、找到WheelTime这个类。然后需要找到如下的代码块:你需要把你所定义的这个名字写进去,其实就是添加一个case选项而已,照着上面画就行,里面的最后一个case是我自己添加的,上面解释的也很详细,我就不多说了。textSize是用来改变你显示的字体大小的,忘写了。

switch(type){
		case ALL:
			textSize = (screenheight / 100) * 3;
			break;
		case YEAR_MONTH_DAY:
			textSize = (screenheight / 100) * 4;
			wv_hours.setVisibility(View.GONE);
			wv_mins.setVisibility(View.GONE);
			break;
		case HOURS_MINS:
			textSize = (screenheight / 100) * 4;
			wv_year.setVisibility(View.GONE);
			wv_month.setVisibility(View.GONE);
			wv_day.setVisibility(View.GONE);
			break;
		case MONTH_DAY_HOUR_MIN:
			textSize = (screenheight / 100) * 3;
			wv_year.setVisibility(View.GONE);
			break;
			//DAY_HOUR_MIN是个类型,在上面的type里面有此字段,
			//不需要显示的使用wv_year.setVisibility(View.GONE);类似代码去掉显示即可
		case DAY_HOUR_MIN:
			textSize = (screenheight / 100) * 4;
			wv_year.setVisibility(View.GONE);
			wv_month.setVisibility(View.GONE);
			break;
		}
最后一步的设置联动监听我已经全部写好了,大家不需要改动了,这里就不展示了。这样就算是添加一种类型了,但是虽然添加了我们还不能显示呢,下面我为大家来解释一下如何显示。

这里的关键代码在tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2());  其实我们跟进去看的时候发现返回的就是一个String类型的方法,继续跟进去我们就会发现玄机了。这个方法其实就是显示你现在的格式。比方说getTime2()这个方法就会显示__日__时__分这种格式的日期和时间。getTime1()就会显示__年__月__日,当然主要是看你怎么写的,这两个方法都是我自己添加的。所以这两个类里面的方法都需要再写一个就能做出这样的效果了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值