转载请注明出处:http://blog.csdn.net/liulongling/article/details/50127819

demo和超级课程表界面和功能有些不一样 如:

1.效果图左侧时间轴,超级课程表是每节课,我做的是每节课对应的时间

2.每周课程切换,超级课程表是点击顶部的第几周显示每周课程,我做的是监听手指手势切换上下周

实现思路:

1.UI上使用ScrollView来实现一天课程的滚动,因为需要实现通过手势来切换每周的课程,所以这里重写了ScrollViewExtend.否则手势监听事件会与ScrollView发生冲突

2.布局上的划分,左边第一列是时间轴,一共24小时。除第一列,后面几列是显示课程内容.知道了每周是7天,每天24小时,屏幕宽高,求得每小时课程宽高,再深入计算每分钟的高度high。最后通过课程的时间 日期和high计算出课程显示的坐标.知道了坐标 剩下就是堆代码了...

代码运行需要配置:

1.注解配置地址:http://jingyan.baidu.com/article/5552ef47c25fea518ffbc9e9.html

2.注解包下载和使用地址:http://jakewharton.github.io/butterknife/

思路一代码:

1>重写ScrollView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_main"android:orientation="vertical" ><includeandroid:id="@+id/weekday"layout="@layout/course_week_date" /><com.app.lll.view.ScrollViewExtendandroid:id="@+id/scroll_body"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/weekday"android:scrollbars="none" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayoutandroid:id="@+id/ll_weekView"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><LinearLayoutandroid:id="@+id/ll_time"android:layout_width="50dp"android:layout_height="wrap_content"android:orientation="vertical" ></LinearLayout><TextViewandroid:layout_width="1.5dp"android:layout_height="match_parent"android:background="#d8d8d8" /><RelativeLayoutandroid:id="@+id/rl_courses"android:layout_width="match_parent"android:layout_height="wrap_content" ></RelativeLayout></LinearLayout><RelativeLayoutandroid:id="@+id/rl_user_courses"android:layout_width="match_parent"android:layout_height="wrap_content" ></RelativeLayout></RelativeLayout></com.app.lll.view.ScrollViewExtend>
</RelativeLayout>
package com.app.lll.view;import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;/*** 重写ScrollView 可以与手势事件共同使用* @author liulongling**/
public class ScrollViewExtend extends ScrollView {GestureDetector gestureDetector;public ScrollViewExtend(Context context) {super(context);}public ScrollViewExtend(Context context, AttributeSet attrs) {super(context, attrs);}public ScrollViewExtend(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public void setGestureDetector(GestureDetector gestureDetector) {this.gestureDetector = gestureDetector;}public boolean onTouchEvent(MotionEvent ev) {super.onTouchEvent(ev);return gestureDetector.onTouchEvent(ev);}public boolean dispatchTouchEvent(MotionEvent ev){gestureDetector.onTouchEvent(ev);super.dispatchTouchEvent(ev);return true;}
}

2>计算课程格子高度宽度

 //第一个格子宽度firstGridWidth =DensityUtils.dp2px(mContext, 50+2);//格子平均宽度aveWidth = (ScreenUtils.getScreenWidth(mContext)-firstGridWidth) / 7;//格子平均高度gridHeight =ScreenUtils.getScreenHeight(mContext) / 12;

3>左侧时间轴

<pre name="code" class="java">public void initViewParams(){if(mHourParams == null){mHourParams = new RelativeLayout.LayoutParams(firstGridWidth,gridHeight);}if(mHourTextParams == null){mHourTextParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);mHourTextParams.addRule(RelativeLayout.CENTER_HORIZONTAL);mHourTextParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);}if(mHourLineParams == null){mHourLineParams = new RelativeLayout.LayoutParams(DensityUtils.dp2px(mContext, 10),DensityUtils.dp2px(mContext, (float)1.5));mHourLineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);mHourLineParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);}}
/*** 初始化24小时*8view*/public void initTwentyFourHourViews(){initViewParams();for(int i=1;i<HOURS.length;i++){for(int j=1;j<=8;j++){if(j==1){addTimeView(i-1);//时间轴}else{addDotView(i,j-1);//小黑点//可以点击的TextView 用来添加课程TextView tx = new TextView(mContext);tx.setId((i - 1) * 7  + j);//相对布局参数RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(aveWidth,gridHeight);//设置他们的相对位置if(j == 2){if(i > 1){rp.addRule(RelativeLayout.BELOW, (i - 2) * 7+j);}}else{//字体样式tx.setTextAppearance(mContext, R.style.courseTableText);rp.addRule(RelativeLayout.RIGHT_OF, (i - 1) * 7  + j - 1);rp.addRule(RelativeLayout.ALIGN_TOP, (i - 1) * 7  + j - 1);tx.setText("");}tx.setLayoutParams(rp);tx.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {int hour = (v.getId()-2)/7;int weekofday=(v.getId() -1)%7;if(weekofday == 0){weekofday = 7;}if(hour < 0){hour = 0;}//莫忘了计算点击的时间时 加上开始时间hour += HOURS[0];if(curClickView!=null){curClickView.setBackground(null);if(curClickView.getId() == v.getId()){curClickView = null;//跳转到添加课程界面return;}}curClickView = v;curClickView.setBackground(getResources().getDrawable(R.drawable.bg_course_add));curClickView.setAlpha((float)0.5);}});courseLayout.addView(tx);}}}}

4>左侧时间轴格子

<pre name="code" class="java">   /*** 时间轴* @param hour 几点*/public void addTimeView(int hour){RelativeLayout layout = new RelativeLayout(mContext);layout.setLayoutParams(mHourParams);//第一个格子里显示2个时间 24点 1点if(hour == 0){RelativeLayout.LayoutParams layoutParams= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);TextView textView = new TextView(mContext);textView.setText("0"+HOURS[0]+":00");textView.setLayoutParams(layoutParams);textView.setTextAppearance(mContext, R.style.weekViewTimeText);layout.addView(textView);}//第一个时间显示在格子顶部 其它时间显示在底部hour = HOURS[hour+1];TextView textView = new TextView(mContext);textView.setLayoutParams(mHourTextParams);textView.setTextAppearance(mContext, R.style.weekViewTimeText);StringBuilder builder = new StringBuilder();builder.append(hour < 10?("0"+hour):hour);builder.append(":00");//22点不显示textView.setText(builder.toString());if(hour == 22){textView.setVisibility(View.INVISIBLE);}layout.addView(textView);//22点横线不显示if(hour != 22){TextView lineView = new TextView(mContext);lineView.setLayoutParams(mHourLineParams);lineView.setBackgroundColor(getResources().getColor(R.color.week_view_black));layout.addView(lineView);}timeLayout.addView(layout);}

思路二代码

自定义view显示课程位置

<pre name="code" class="java">/*** 根据课程时间绘制课程显示的位置* @param name    课程名称* @param sHour   课程开始时间* @param sHour   课程开始分钟* @param min     这节课有多少分钟* @param weekday 周几*/public void addCourseView(Lesson bean){int[] sParams = DateUtil.getTime(bean.getsTime());int[] eParams = DateUtil.getTime(bean.geteTime());if(sParams == null || eParams == null){return;}//开始时间 分钟  总时间int sHour,sMin,eHour,eMin,min;sHour = sParams[0];sMin = sParams[1];eHour= eParams[0];eMin = eParams[1];if(eHour > sHour || eMin > sMin){min = (eHour - sHour)*60+(eMin - sMin);if(min < 40){min = 40;}//课程高度float minHeight = (float)gridHeight/(float)60;int cHeight = (int)(((float)gridHeight/(float)60)*min);int weekday = DateUtil.getWeekOfDate(bean.getLessonDate());if(weekday == 0){weekday = 7;}//1.添一个相对布局 来存储图片和文字RelativeLayout layout = new RelativeLayout(mContext);layout.setTag(String.valueOf(bean.getId()));RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(aveWidth,cHeight);//Calculate the location of the course Since the beginning of the course is from 7 points  rlp.topMargin = (sHour-7)*gridHeight+(int)(minHeight*sMin);rlp.leftMargin = firstGridWidth+(weekday-1)*aveWidth;layout.setLayoutParams(rlp);//设置背景框layout.setBackgroundResource(R.drawable.course_bg);//设置背景颜色GradientDrawable  drawable =(GradientDrawable) layout.getBackground();drawable.setColor(ColorUtils.getFillColor(1));//设置描边颜色drawable.setStroke(DensityUtils.dp2px(mContext, 2),ColorUtils.getStrokeColor(2));//bean.status == ClientCode.YS?mContext.getResources().getColor(background[0]):mContext.getResources().getColor(background[DateUtil.getWeekDay()])//设置不透明度layout.getBackground().setAlpha(222);//2.添加课程TextView courseInfo = new TextView(mContext);StringBuilder builder = new StringBuilder();builder.append(bean.getsTime());builder.append("\n");builder.append(" ");builder.append(bean.getName());courseInfo.setText(builder.toString());// 偏移由这节课是星期几决定//rlp.addRule(RelativeLayout.RIGHT_OF, 1);// 字体居中//courseInfo.setGravity(Gravity.CENTER);RelativeLayout.LayoutParams layoutParams= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);courseInfo.setTextSize(12);courseInfo.setLayoutParams(layoutParams);courseInfo.setTextColor(Color.WHITE);layout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//课程信息界面}});layout.addView(courseInfo);//课程以上显示已经图标if(bean.getStatus() == 1){layout.addView(addClassOkIcon());}mUserCourseLayout.addView(layout);}}

源码下载地址(需CSDN积分):http://download.csdn.net/detail/liulongling/9422256

源码github地址:https://github.com/liulongling/CourseTable.git

【android】项目案例(一)之超级课程表相关推荐

  1. Android项目源码界面超级华丽的仿QQ最新版本

    http://www.javaapk.com/source/4301.html

  2. android 项目实战——打造超级课程表一键提取课表功能

    转载文章请注明来自http://blog.csdn.net/sbsujjbcy 如果你是在校大学生,或许你用多了各种课程表,比如课程格子,超级课程表.它们都有一个共同点就是可以一键导入教务处的课程.那 ...

  3. Android超级课程表实现原理

    感觉有必要更新一下文章.很久之前看到的这篇博文,觉得写的不错,故转载收藏.之后陆续有人私信相关问题(要源码什么的),都没有过多的回复. -------------------------------- ...

  4. Android仿照超级课程表 or 课程格子 一键提取课表功能(方正系统)

    参考文章http://blog.csdn.net/sbsujjbcy  ,本文仿照'  安卓弟  '提供的android 项目实战--打造超级课程表一键提取课表功能文章,对他的代码进行了修改和补充,为 ...

  5. Android经典项目案例开发实战宝典

    Android经典项目案例开发实战宝典 Android 系统并不自带文件管理器,但是很多情况下,我们有诸如从SD中打开文件的需要,怎么办呢?相信大家都比较习惯Windows 下操作文件和文件夹的方式, ...

  6. android学习:《超级课程表》的课表界面设计

    <超级课程表>的课表界面设计 话不多说,直接看效果图 下面我们来看<超级课程表的界面> 这样的话,我们需要自定义三种视图: 1.自定义 View方格背景 2.自定义 ViewG ...

  7. 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析

    Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...

  8. android超级课程表

    超级课程表火了有一阵子,最近安装体验了下,对里面自动导入课表这个功能很好奇--不清楚各大教学平台网站的API情况下,怎么获得相应数据? 网上搜了下,找到这篇博文,讲解很详尽,做个收藏. 主要工作是抓包 ...

  9. android超级课程表原理

    说起来很奇怪,为什么超级课程表火了这么久,关于原理的帖子就从来没出现过.这是我第一次在CSDN写博客,以前都写在自己的网站上了,希望大家能够支持我谢谢. 由于我是长沙理工大学的大二在校生,所以我接下来 ...

最新文章

  1. 应用化学:从二氯甲烷到四氯化碳
  2. 华尔街英语软件_华尔街英语吧啦吧啦聊点啥:美式“人情世故”
  3. 【Cocosd2d实例教程八】Cocos2d实现碰撞检测(含实例)
  4. 面试心得与总结—BAT、网易、蘑菇街
  5. CentOS7,zabbix3.4通过,zabbix-Java-gateway监控Tomcat
  6. linux加载内核后如何运行app,Android app启动过程
  7. 【深度学习】三维点云数据集总结
  8. 为什么程序员对旧代码深恶痛绝?
  9. c语言中十进制与十六进制转换_小猿圈分享-java-十进制、八进制、十六进制数互相转换...
  10. 某大型银行深化系统技术方案之十五:服务层之服务调用
  11. AWT_事件监听(Java)
  12. 硅谷钢铁侠的的传奇人生
  13. infor wms 中英文对照_视听盛宴 I纸牌屋揭露美国政治权力运作(16中英、纯英、无字幕可切换视频+中英文全剧本+全季音频)...
  14. 家庭風水的六大注意事項_家居风水自查
  15. Spark - Core 随笔
  16. html 小猪佩奇代码,HTML5之canvas画小猪佩奇~
  17. 个人微信淘客机器人api开发
  18. DCGAN论文改进之处+简化代码
  19. 20多年前微软曾计划收购,任天堂嘲讽道:“笑死我了”
  20. gcms基峰有什么用_请收下!来自前辈的“气质联用”经验分享

热门文章

  1. 机器学习中的算法:支持向量机(SVM)基础
  2. Android如何查看手机网卡信息和ip信息
  3. 用笔记本做路由器共享4G流量
  4. 吐血分享:QQ群霸屏技术教程2017(活跃篇)
  5. VMware 安装WIN10 WIN7
  6. 了解CI/CD流水线
  7. IoT原型开发利用现成的单板设计---凯利讯半导体
  8. java 实现ps功能_JS实现在线ps功能详解
  9. Win10-1809 离线安装 .net framework 3.5
  10. 好佳居软装十大品牌 软装市场发展状况如何