一两年之前,项目中有大佬写过课程表这个功能,今天复习自定义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自定义课程格子相关推荐

  1. android 仿课程格子,课程格子对比超级课程表 实用性大比拼

    开学在即,大家已经做好准备了吗?新学期我们除了要接受新的挑战,新的同学之外,还有就是新的课表,现在的学生压力是越来越大,课程也是越来越多,如何才能够更好的安排课程,单是一张纸质的课表可不管用,今天小编 ...

  2. [学习笔记-Android]仿课程格子界面

    参考littleY- 仿超级课程表的课程界面设计 效果如下图 1. 整个界面可以上下滚动,但第一栏显示周几的并不参与滚动2. 显示课程简要信息的块可以跨行合并显示 1.首先需要一个ScrollView ...

  3. android 课程格子界面,大学新生必备!Android课程格子App试用

    1课程格子试用:建立课程表 又是一年开学季,相信有不少太平洋的读者都已经结束了暑假迈进了校门,脱离高三党的同学也为数不少.作为一个大学新生,你在未来数年里想要找基友也好,泡妹子也好,都免不掉主要的任务 ...

  4. android 课程格子源码,课程格子Android客户端产品体验报告

    概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:课程格子Android客户端 软件版本:6.1 需求分析 目标人群:在校大学生 使用场景:大学生课前查看课程, ...

  5. android 课程格子,课程表也能撩学妹?安卓课程格子App体验

    快乐的时光过得特别快,很快各位学生党就要迎来新学期了.课程表对学生的意义不言而喻,特别是对作息自理的大学生来说,没课程表不知道要不要上课丝毫不奇怪,这时在手机上装一个课程表App就省事多了.课程表Ap ...

  6. 浅谈android网络框架——以课程格子的bug为例

    大家好! 在使用课程格子过程中 ,发现如果网络断开,点击树洞秘密,课程格子会因为无法从网络上刷新数据而崩溃掉.今天借解决此bug的为例,浅谈android的网络框架.

  7. android 自定义view画表格,Android自定义View实现课程表表格

    自己闲下来时间写的一个课表控件,使用的自定义LinearLayout,里面View都是用代码实现的,最终效果如下图,写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课程 ...

  8. Android 自定义View课程表表格

    自己闲下来时间写的一个课表控件使用的自定义LinearLayout 里面View都是用代码实现的 最终效果如下图 写的可能有问题希望多多指点   创建一个自定义LinearLayout 控件用来装载课 ...

  9. Android自定义View课程表,Android 自定义View课程表表格

    自己闲下来时间写的一个课表控件使用的自定义LinearLayout 里面View都是用代码实现的 最终效果如下图 写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课程的 ...

最新文章

  1. php – Laravel 7 Session Lifetime
  2. qt学习之路3 ---信号与槽机制
  3. ITK:表面提取之前平滑二值图像
  4. ACM MM2021 | 腾讯优图实验室9篇论文入选,含弱监督图像描述及定位、表格结构识别等研究方向...
  5. 数据结构 | 链表队列(基本操作及图示)
  6. 17.1.1.3 Creating a User for Replication 创建一个用于用于复制:
  7. 维基媒体宣布采用 Vue.js 进行前端开发
  8. 【王道操作系统笔记】系统调用
  9. oracle must be declared,oracle must be declared
  10. java中String字符串
  11. 常见不等式考察(一)——Jensen不等式
  12. 《物联篮球计分器》Android应用程序开发-期末课程设计
  13. 软件项目管理 项目任务和任务间依赖关系
  14. 喝咖啡的好处和坏处及注意事项
  15. Synchronized 用法以及和ReetrantLock的区别
  16. ISP Pipeline AWB
  17. 精进1-职业价值 by采铜
  18. 量子计算机 儿童画,星汉璀璨只见你
  19. 【Java 数据结构】Map和Set
  20. [2022.1.13]UPC-2021级新生个人训练赛第22场-9783 Problem H 铺地砖

热门文章

  1. 1.6 iOS模拟器的基本使用方法 [原创iOS开发-Xcode教程]
  2. 808. 分汤 : 挺有意思的 DP 题
  3. 使用kali nethunter执行badUSB攻击--基于Rucky工具
  4. 区块链上节点如何验证新区块是否合法?
  5. 计算机体系结构:系统加速比计算例题(1.1 1.2 1.3)
  6. 前缀表达式中缀表达式后缀表达式之间的转换JAVA代码实现
  7. 手把手教你声音克隆(so-vits-svc)
  8. 洗地机到底好不好用,洗地机好还是扫地机器人好
  9. 计算机怎样辅助英语教学,论计算机在英语教学中的辅助作用(原稿)
  10. VirtualBox命令行接口VBoxManage配置