Android自定义课程格子
一两年之前,项目中有大佬写过课程表这个功能,今天复习自定义View,就自己动手写写;有不对的地方,请各位大佬指出来,歇歇-_-
写给我自己,用作学习记录
效果如下:(数据是自己瞎编的)
接下来直接上代码:
1.MainActivity.java:
2.main_activity.xml
3.ScheduleView:课程表控件
package com.example.admin.test.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import com.example.admin.test.R; import com.example.admin.test.utils.DensityUtils; import java.util.ArrayList; /** * Created by Admin on 2018/4/11. */ public class ScheduleView extends View {private static String TAG = ScheduleView.class.getSimpleName(); /** * 单个课程宽度 */ private int width = 30; /** * 单个课程高度 */ private int height = 15; /** * 课程表第一行高度 */ private int topHeight = 20; /** * 课程表左边第一列宽度 */ private int leftWidth = 20; /** * 课程中间间隔高度 */ private int middleHeight = 20; private ArrayList<String> list;//课程数据 private String[] days = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; private String[] courseNumber = {"1", "2", "3", "4", "5", "6", "7", "8"}; private int[] colors = {R.color.color_8cbf52, R.color.color_cccccc, R.color.color_ffffff, R.color.color_65686a, R.color.colorPrimary, R.color.colorPrimaryDark, R.color.colorAccent, R.color.color_ffffff, R.color.color_65686a, R.color.colorPrimary};//课程背景颜色 private int scheduleWidth = 0;//课程表总宽度 private int scheduleheight = 0;//课程表总高度 private Paint paint1;//绘制线条 private Paint paint2;//绘制文字 private Paint paint3;//绘制格子背景 private Paint pFont;//测量文字使用 private Rect rect;//测量文字使用 private ArrayList<String[]> allCourse;//将传进来的数据整理后存在这里 private String[] str;//每一天的课程 private String course;//单个课程名字 private int num = 0;//取颜色用的随机数 public ScheduleView(Context context) {super(context); init(context); }public ScheduleView(Context context, @Nullable AttributeSet attrs) {super(context, attrs); init(context); }private void init(Context context) {allCourse = new ArrayList(); width = DensityUtils.dp2px(context, 50); height = DensityUtils.dp2px(context, 40); topHeight = DensityUtils.dp2px(context, 30); leftWidth = DensityUtils.dp2px(context, 30); middleHeight = DensityUtils.dp2px(context, 30); scheduleWidth = leftWidth + days.length * width; scheduleheight = topHeight + courseNumber.length * height; paint1 = new Paint(); paint1.setColor(getResources().getColor(R.color.color_cccccc)); paint1.setAntiAlias(true); paint1.setStrokeWidth(5); paint2 = new Paint(); paint2.setColor(getResources().getColor(R.color.color_000000)); paint2.setAntiAlias(true); paint2.setTextSize(DensityUtils.sp2px(context, 14)); paint2.setStrokeWidth(5); paint3 = new Paint(); paint3.setColor(colors[(int) (Math.random() * 10)]); paint3.setAntiAlias(true); paint3.setStrokeWidth(5); pFont = new Paint(); pFont.setTextSize(DensityUtils.sp2px(context, 14)); rect = new Rect(); }public void setData(ArrayList<String> list) {this.list = list; if (this.list == null) {this.list = new ArrayList<>(); }for (int i = 0; i < 56; i += 8) {str = new String[8]; for (int j = 0; j < 8; j++) {str[j] = this.list.get(i + j); }allCourse.add(str); str = null; }}@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec); }@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas); drawTop(canvas); drawLeft(canvas); drawOthers(canvas); }private void drawOthers(Canvas canvas) {for (int i = 0; i < days.length; i++) {for (int j = 0; j < courseNumber.length; j++) {num = (int) (Math.random() * 10); paint3.setColor(getResources().getColor(colors[num])); if (j == 3) {//绘制背景色 canvas.drawRect(leftWidth + i * width, topHeight + j * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint3); //绘制文字 course = (allCourse.get(i))[j]; pFont.getTextBounds(course, 0, TextUtils.isEmpty(course) ? 0 : course.length(), rect); canvas.drawText(course, leftWidth + i * width + width / 2 - rect.width() / 2, topHeight + j * height + height / 2 + rect.height() / 2, paint2); //绘制边线 canvas.drawLine(leftWidth + i * width, topHeight + (j + 1) * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint1); canvas.drawLine(leftWidth + (i + 1) * width, topHeight + j * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint1); //绘制中间分隔条 paint3.setColor(getResources().getColor(R.color.color_FFF68F)); canvas.drawRect(leftWidth + i * width, topHeight + (j + 1) * height, leftWidth + (i + 1) * width, topHeight + middleHeight + (j + 1) * height, paint3); canvas.drawLine(leftWidth + i * width, topHeight + (j + 1) * height + middleHeight, leftWidth + (i + 1) * width, topHeight + (j + 1) * height + middleHeight, paint1); } else if (j > 3) {//绘制背景色 canvas.drawRect(leftWidth + i * width, topHeight + middleHeight + j * height, leftWidth + (i + 1) * width, topHeight + middleHeight + (j + 1) * height, paint3); //绘制文字 course = (allCourse.get(i))[j]; pFont.getTextBounds(course, 0, TextUtils.isEmpty(course) ? 0 : course.length(), rect); canvas.drawText(course, leftWidth + i * width + width / 2 - rect.width() / 2, middleHeight + topHeight + j * height + height / 2 + rect.height() / 2, paint2); //绘制边线 canvas.drawLine(leftWidth + i * width, topHeight + (j + 1) * height + middleHeight, leftWidth + (i + 1) * width, topHeight + (j + 1) * height + middleHeight, paint1); canvas.drawLine(leftWidth + (i + 1) * width, topHeight + j * height + middleHeight, leftWidth + (i + 1) * width, topHeight + (j + 1) * height + middleHeight, paint1); } else {//绘制背景色 canvas.drawRect(leftWidth + i * width, topHeight + j * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint3); //绘制文字 course = (allCourse.get(i))[j]; pFont.getTextBounds(course, 0, TextUtils.isEmpty(course) ? 0 : course.length(), rect); canvas.drawText(course, leftWidth + i * width + width / 2 - rect.width() / 2, topHeight + j * height + height / 2 + rect.height() / 2, paint2); //绘制边线 canvas.drawLine(leftWidth + i * width, topHeight + (j + 1) * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint1); canvas.drawLine(leftWidth + (i + 1) * width, topHeight + j * height, leftWidth + (i + 1) * width, topHeight + (j + 1) * height, paint1); }}}}private void drawLeft(Canvas canvas) {paint3.setColor(getResources().getColor(R.color.color_FFF68F)); canvas.drawRect(0, topHeight, leftWidth, scheduleheight + middleHeight, paint3); canvas.drawLine(0, topHeight, 0, scheduleheight + middleHeight, paint1); canvas.drawLine(leftWidth, topHeight, leftWidth, scheduleheight + middleHeight, paint1); for (int j = 0; j < courseNumber.length + 1; j++) {if (j != 0 && j != courseNumber.length + 1) {pFont.getTextBounds(courseNumber[j - 1], 0, courseNumber[j - 1].length(), rect); if (j > 4) {canvas.drawText(courseNumber[j - 1], leftWidth / 2 - rect.width() / 2, middleHeight + topHeight + j * height - height / 2 + rect.height() / 2, paint2); } else {canvas.drawText(courseNumber[j - 1], leftWidth / 2 - rect.width() / 2, topHeight + j * height - height / 2 + rect.height() / 2, paint2); }}if (j == 4) {canvas.drawLine(0, topHeight + j * height, leftWidth, topHeight + j * height, paint1); canvas.drawRect(0, topHeight + 4 * height, leftWidth, topHeight + 4 * height + middleHeight, paint3); canvas.drawLine(0, topHeight + j * height + middleHeight, leftWidth, middleHeight + topHeight + j * height, paint1); } else if (j > 4) {canvas.drawLine(0, topHeight + j * height + middleHeight, leftWidth, topHeight + j * height + middleHeight, paint1); } else {canvas.drawLine(0, topHeight + j * height, leftWidth, topHeight + j * height, paint1); }}}private void drawTop(Canvas canvas) {paint3.setColor(getResources().getColor(R.color.color_FFF68F)); canvas.drawRect(0, 0, scheduleWidth, topHeight, paint3); canvas.drawLine(0, 0, scheduleWidth, 0, paint1); canvas.drawLine(0, 0, 0, topHeight, paint1); canvas.drawLine(0, topHeight, scheduleWidth, topHeight, paint1); for (int j = 0; j < days.length + 1; j++) {if (j != 0 && j != days.length + 1) {pFont.getTextBounds(days[j - 1], 0, days[j - 1].length(), rect); canvas.drawText(days[j - 1], leftWidth + j * width - width / 2 - rect.width() / 2, topHeight / 2 + rect.height() / 2, paint2); }canvas.drawLine(leftWidth + j * width, 0, leftWidth + j * width, topHeight, paint1); }} }
还有很多需要改进的地方,之后会继续修改
Android自定义课程格子相关推荐
- android 仿课程格子,课程格子对比超级课程表 实用性大比拼
开学在即,大家已经做好准备了吗?新学期我们除了要接受新的挑战,新的同学之外,还有就是新的课表,现在的学生压力是越来越大,课程也是越来越多,如何才能够更好的安排课程,单是一张纸质的课表可不管用,今天小编 ...
- [学习笔记-Android]仿课程格子界面
参考littleY- 仿超级课程表的课程界面设计 效果如下图 1. 整个界面可以上下滚动,但第一栏显示周几的并不参与滚动2. 显示课程简要信息的块可以跨行合并显示 1.首先需要一个ScrollView ...
- android 课程格子界面,大学新生必备!Android课程格子App试用
1课程格子试用:建立课程表 又是一年开学季,相信有不少太平洋的读者都已经结束了暑假迈进了校门,脱离高三党的同学也为数不少.作为一个大学新生,你在未来数年里想要找基友也好,泡妹子也好,都免不掉主要的任务 ...
- android 课程格子源码,课程格子Android客户端产品体验报告
概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:课程格子Android客户端 软件版本:6.1 需求分析 目标人群:在校大学生 使用场景:大学生课前查看课程, ...
- android 课程格子,课程表也能撩学妹?安卓课程格子App体验
快乐的时光过得特别快,很快各位学生党就要迎来新学期了.课程表对学生的意义不言而喻,特别是对作息自理的大学生来说,没课程表不知道要不要上课丝毫不奇怪,这时在手机上装一个课程表App就省事多了.课程表Ap ...
- 浅谈android网络框架——以课程格子的bug为例
大家好! 在使用课程格子过程中 ,发现如果网络断开,点击树洞秘密,课程格子会因为无法从网络上刷新数据而崩溃掉.今天借解决此bug的为例,浅谈android的网络框架.
- android 自定义view画表格,Android自定义View实现课程表表格
自己闲下来时间写的一个课表控件,使用的自定义LinearLayout,里面View都是用代码实现的,最终效果如下图,写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课程 ...
- Android 自定义View课程表表格
自己闲下来时间写的一个课表控件使用的自定义LinearLayout 里面View都是用代码实现的 最终效果如下图 写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课 ...
- Android自定义View课程表,Android 自定义View课程表表格
自己闲下来时间写的一个课表控件使用的自定义LinearLayout 里面View都是用代码实现的 最终效果如下图 写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课程的 ...
最新文章
- php – Laravel 7 Session Lifetime
- qt学习之路3 ---信号与槽机制
- ITK:表面提取之前平滑二值图像
- ACM MM2021 | 腾讯优图实验室9篇论文入选,含弱监督图像描述及定位、表格结构识别等研究方向...
- 数据结构 | 链表队列(基本操作及图示)
- 17.1.1.3 Creating a User for Replication 创建一个用于用于复制:
- 维基媒体宣布采用 Vue.js 进行前端开发
- 【王道操作系统笔记】系统调用
- oracle must be declared,oracle must be declared
- java中String字符串
- 常见不等式考察(一)——Jensen不等式
- 《物联篮球计分器》Android应用程序开发-期末课程设计
- 软件项目管理 项目任务和任务间依赖关系
- 喝咖啡的好处和坏处及注意事项
- Synchronized 用法以及和ReetrantLock的区别
- ISP Pipeline AWB
- 精进1-职业价值 by采铜
- 量子计算机 儿童画,星汉璀璨只见你
- 【Java 数据结构】Map和Set
- [2022.1.13]UPC-2021级新生个人训练赛第22场-9783 Problem H 铺地砖
热门文章
- 1.6 iOS模拟器的基本使用方法 [原创iOS开发-Xcode教程]
- 808. 分汤 : 挺有意思的 DP 题
- 使用kali nethunter执行badUSB攻击--基于Rucky工具
- 区块链上节点如何验证新区块是否合法?
- 计算机体系结构:系统加速比计算例题(1.1 1.2 1.3)
- 前缀表达式中缀表达式后缀表达式之间的转换JAVA代码实现
- 手把手教你声音克隆(so-vits-svc)
- 洗地机到底好不好用,洗地机好还是扫地机器人好
- 计算机怎样辅助英语教学,论计算机在英语教学中的辅助作用(原稿)
- VirtualBox命令行接口VBoxManage配置