Android会议室管理app

1 先来张图



2 原理

2.1系统原理

实现了会议室的预定功能,且通过日历时间轴等等控件来控制会议室的使用。

2.2数据库

使用了郭霖的LitePal,具体请移步http://blog.csdn.net/guolin_blog

2.3TimeLine控件源码

package com.example.shijianzhou;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;

import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;
import android.util.AttributeSet;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * 用来实现会议预定的时间轴。
 * 
 * @version 0.1
 * @author zhou
 * 
 */
public class TimeLine extends LinearLayout {

	private Runnable mTicker;
	private Handler mHandler;
	/**
	 * 控制定时线程是否运行的flag。
	 */
	private boolean mTickerStopped;
	private Calendar mCalendar;
	private String mFormat = "hh:mm:ss";
	private ImageView pasttime;
	private int Width;
	private int Height;
	private LinearLayout mainline;

	private ArrayList<HashMap<String, Integer>> huiyitimelist;

	public TimeLine(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		LayoutInflater.from(context).inflate(R.layout.timeline, this, true);
		pasttime = (ImageView) findViewById(R.id.pasttime);
		mainline = (LinearLayout) findViewById(R.id.mainline);
		initTimeLine(context);
	}

	@Override
	protected void onAttachedToWindow() {
		super.onAttachedToWindow();
		setmTickerstart();
	}

	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		mTickerStopped = true;
	}

	private void initTimeLine(Context context) {
		if (mCalendar == null) {
			mCalendar = Calendar.getInstance();
		}
		huiyitimelist = new ArrayList<HashMap<String, Integer>>();
		// 取得屏幕的宽度和高度
		WindowManager windowManager = (WindowManager) getContext()
				.getSystemService(Context.WINDOW_SERVICE);
		Display display = windowManager.getDefaultDisplay();
		Width = display.getWidth();
		Height = display.getHeight();
	}

	/**
	 * 
	 * 移动游标到指定位置。
	 * 
	 * @param position
	 *            位置参数。
	 */
	public void movePoint(int position) {
		android.view.ViewGroup.LayoutParams params = pasttime.getLayoutParams();
		params.width = position;
		pasttime.setLayoutParams(params);
	}

	/**
	 * 
	 * 使时间轴上指定的一段变红,即该段时间会议室已经被预定。
	 * 
	 * @param start
	 *            起始时间(秒)
	 * @param end
	 *            结束时间(秒)
	 * 
	 * @return -1 失败 1 成功。
	 */
	public int setSegmentRed(int start, int end) {
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		map.put("starttime", start);
		map.put("endtime", end);
		start = start * Width / (24 * 60 * 60);
		end = end * Width / (24 * 60 * 60);
		map.put("start", start);
		map.put("end", end);
		if (end <= start) {
			return -1;// 代表会议时间错误。
		}
		for (int i = 0; i < huiyitimelist.size(); i++) {
			int startlocal = huiyitimelist.get(i).get("start");
			int endlocal = huiyitimelist.get(i).get("end");
			if ((start > startlocal & start < endlocal)
					| (end > startlocal & end < endlocal)) {
				return -2;// 代表会议时间冲突。
			}
		}
		huiyitimelist.add(map);
		mainline.removeAllViews();
		for (int i = 0; i < huiyitimelist.size(); i++) {
			int startlocal = huiyitimelist.get(i).get("start");
			int endlocal = huiyitimelist.get(i).get("end");
			LinearLayout layout_sub_Lin = new LinearLayout(getContext());
			LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.MATCH_PARENT,
					LinearLayout.LayoutParams.MATCH_PARENT);
			LP_WW.width = (endlocal - startlocal);
			if (i == 0) {
				LP_WW.leftMargin = startlocal;
			} else {
				LP_WW.leftMargin = startlocal
						- huiyitimelist.get(i - 1).get("end");
			}
			layout_sub_Lin.setLayoutParams(LP_WW);
			layout_sub_Lin.setBackgroundColor(0x88ffff00);
			mainline.addView(layout_sub_Lin);
		}
		return 1;
	}

	/**
	 * 清除所有时间轴上的会议占用时间标记。
	 */
	public void clearAllsegment() {
		mainline.removeAllViews();
		huiyitimelist.clear();
	}

	/**
	 * 控制定时器是否继续工作。
	 * 
	 * @param mTickerStopped
	 *            true则时钟停止。
	 */
	public void setmTickerStopped() {
		mTickerStopped = true;
		movePoint(0);
	}

	/**
	 * 时间轴动起来。
	 */
	public void setmTickerstart() {
		// TODO Auto-generated method stub
		mTickerStopped = false;
		mHandler = new Handler();
		mTicker = new Runnable() {
			public void run() {
				if (mTickerStopped) {
					return;
				} else {
					mCalendar.setTimeInMillis(System.currentTimeMillis());
					Time t = new Time(); // or Time t=new Time("GMT+8"); 加上Time
											// Zone资料。
					t.setToNow(); // 取得系统时间。
					int hour = t.hour; // 0-23
					int minute = t.minute;
					int second = t.second;
					int allseconds = hour * 60 * 60 + minute * 60 + second;
					int point = allseconds * Width / (24 * 60 * 60);
					movePoint(point);
					invalidate();
					// 遍历是否有会议开始或者结束。
					// Log.v("znz", "size --> " + huiyitimelist.size());
					// Log.v("znz",
					// "starttime --> "
					// + huiyitimelist.get(0).get("starttime"));
					// Log.v("znz", "allseconds ---> " + allseconds);
					// Log.v("znz",
					// "endtime --> " + huiyitimelist.get(0).get("endtime"));
					for (int i = 0; i < huiyitimelist.size(); i++) {
						if (allseconds >= huiyitimelist.get(i).get("starttime")
								& allseconds <= huiyitimelist.get(i).get(
										"endtime")) {

							if (timelinecallback != null) {
								timelinecallback.huiyiStarted(huiyitimelist
										.get(i).get("starttime"), huiyitimelist
										.get(i).get("endtime"));
								break;
							}
						}
						if (i == (huiyitimelist.size() - 1)) {
							if (timelinecallback != null) {
								timelinecallback.huiyiStoped();
							}
						}
					}
					long now = SystemClock.uptimeMillis();
					long next = now
							+ (1000 - System.currentTimeMillis() % 1000);
					mHandler.postAtTime(mTicker, next);
				}
			}
		};
		mTicker.run();
	}

	private TimelineCallback timelinecallback;

	/**
	 * @param timelinecallback
	 *            the timelinecallback to set
	 */
	public void setTimelinecallback(TimelineCallback timelinecallback) {
		this.timelinecallback = timelinecallback;
	}

}
2.4项目下载

http://download.csdn.net/detail/zhounanzhaode/8902951

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值