1. 程式人生 > >Android會議室管理app

Android會議室管理app

1 先來張圖


2 原理

2.1系統原理

實現了會議室的預定功能,且通過日曆時間軸等等控制元件來控制會議室的使用。

2.2資料庫

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專案下載

相關推薦

Android會議室管理app

1 先來張圖 2 原理 2.1系統原理 實現了會議室的預定功能,且通過日曆時間軸等等控制元件來控制會議室的使用。 2.2資料庫 2.3TimeLine控制元件原始碼 package com.example.shijianzhou; import java.util.

[譯]Android記憶體管理: 理解App的PSS

Android記憶體管理: 理解App的PSS 當在應用程式上執行Little Eye時,在記憶體檢視中,會報告有關應用程式記憶體的3個重要統計資訊。 Dalvik記憶體使用情況,即Java堆消耗的記憶體量,Native記憶體,即JVM外部程序使用的記憶體

日程管理app(bug report)

報錯 進行 android 設置 用戶登錄 登錄驗證 理想 運行 rip 一、用戶登錄驗證密碼過短   Description:   測試環境:Android Studio自帶的ADT模擬器(安卓6.0)   準備工作:將工程導入AS,並啟動模擬器進行測試   測試步驟:1

日程管理APP的測試計劃和測試矩陣

集成 說明 計劃 idt 無線 roi ble -c nbsp 測試計劃:(完成整個APP時間:2周) 編號 測試時間 測試內容 1 第2天 在需求設計階段,檢查產品說明文檔及設計文檔 2 第3~9天 在編碼階段,編寫測試用例 3 第10~11天 集成測試

學生管理App測試計劃余測試矩陣

andro 管理員 屏幕分辨率 分辨率 ios 4.4 開始 ble 學生 學生管理測試計劃: 裏程碑項目 開始時間 結束時間 測試規劃 2017.4.1 2017.4.2 測試設計 2017.4.2 2017.4.3 測試設計實施 2017.4.4 20

日程管理APP測試用例

nbsp 圖庫 代碼實現 符號 訪問 攝像 led height 測試用例 No. 測試用例 實際結果 期望結果 測試結果(Pass/Failed) 備註 1 輸入僅有數字或字母的用戶名及密碼,點擊註冊 註冊成功 註冊成功 Pass / 2 輸入含有特殊符

Android 輸入管理服務-輸入事件到達之後的處理流程

content 例如 enter 技術 fontsize tail 流程 ref ora 接上一篇博客“Android 輸入管理服務啟動過程的流程”。這兩天分析了Android 輸入管理服務接收到輸入事件之後的處理流程,詳細流程例如以下面兩圖所看到的:

Android中使App高速、簡單地支持新浪微博、微信、QQ、facebook等十幾個主流社交平臺的分享功能

分析 ont renren androidm mod 執行 xen 12px 操作 前言 在如今的APP或者遊戲中,分享功能差點兒已經成為標配。分享功能不但能夠滿足用戶的需求。也能夠為產品帶來很多其它的用戶,甚至能夠對用戶的行為、活躍度、年齡段等情況進行數據統計,使得軟

新智慧管理APP,為服務商量身打造

采寶管理APP 采寶支付服務平臺 盼望著,盼望著,屬於咱們采寶服務商自己的“采寶聯盟APP”,今天正式上線了!合作夥伴們(包括管理員、業務員賬號)除了可以繼續在“采寶服務商後臺系統”操作外,在手機上下載安裝一個“采寶聯盟APP” ,就能盡享“一機在手,商戶我有”的暢快!

Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setHomeButtonEnabled(boolean)' on a null object reference

tac perf cti pla invoke one spa n) null 【Android】getActionBar()為null的解決方法總結 setContentView(R.layout.activity_main);android.support.v7.app

日程管理app

post 筆記 方法 ase ng- 格子 筆記本 view 背景 背景: 普通的筆記本顯然具有保存占用較大空間的弊端。而筆記類app又借助於虛擬按鍵輸入,便利度稍

Android Studio安裝部署系列】十八、Android studio更換APP應用圖標

tail map 安全區 大小 next detail 有時 ash blog 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 概述 Android Studio新建項目後會有一個默認圖標,那麽如何更換圖標呢? 替換圖標 這個方案不建議直接在已有項目上更換

Android管理機制(二)PackageInstaller安裝APK

tac _id cas 賦值 complete get Owner 執行 context 前言 在本系列上一篇文章Android包管理機制(一)PackageInstaller的初始化中我們學習了PackageInstaller是如何初始化的,這一篇文章我們接著學習Pack

Android 監聽APP進入後臺或切換到前臺方案對比

api 5.0 等等 推薦一個 情況 lis 需要 推出 soc 在我們開發的過程中,經常會遇到需要我們判斷app進入後臺,或者切換到前臺的情況。比如我們想判斷app切換到前臺時,顯示一個解鎖界面,要求用戶輸入解鎖密碼才能繼續進行操作;我們想判斷app切換到後臺,記錄一下l

Android學習之APP點擊功能閃退問題的處理一

分享 com info png 事件 測試 問題: 代碼 src java代碼如下: activity_main.xml代碼如下: APP測試問題:安裝好APP後,點擊“點擊事件”,APP會閃退 檢查方向: 1.查看java代碼中的成員變量textview是否初始化 2

Android P的APP適配總結,讓你快人一步

信息 最新 webview 包名 圖片 bmp illegal 名單 block 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由QQ音樂技術團隊發表於雲+社區專欄 上篇:Android P 行為變更適配 Android P 這次有很多行為變更,其中不

必須做作業三:某Android端點餐App中觀察者模式解析

onclick https 直接 tro lstat strong set lis drag 該項目還在開發中,目前開發了原型界面,是為了實現顧客從點餐到付款的全行為流程。並且提供菜品的詳情頁面和其他服務接口。 在此就以點餐界面的實現為例,分析該項目的觀察者模式 一、模

Android 7.0 app升級內部安裝apk—FileProvider使用

隨著Android 版本升級 Google在保護使用者隱私和安全方面增加了力度 像Android 6.0 細分了普通許可權和高危許可權,涉及到高危許可權則需要及時申請使用者必須感知。Android7.0 增加了 "StrictMode API" 政策即私有目錄限制訪問。本篇講解一下如何在Androi

Android 記憶體管理記錄

專案中用到大量大圖,造成快速切換Activity後記憶體不足,如登入介面用到3M高清大圖,裝置選擇用到5張大圖背景疊加效果,主介面用到了5張遮罩大圖,設定介面總的子activity中也有大圖出現。 啟動Splash——裝置選擇介面(保留棧低,不finish,但會把背景圖片回收)-->主介面-

android 如何判讀app應用是否擁有某種許可權

"android.permission.CAMERA"表示要判斷的許可權,此處以相機許可權為例說明 "com.zhengyuan.learningqrscan"表示專案的包名 //動態申請許可權 private void getPrimission() { Packa