有一个项目要使用工作表,选择使用canvas来绘制。实现显示工作日程的选择,可点击加入和取消,效果图:http://jwzhangjie.com/workplan.gif

自己定义控件FormView:

package com.sun.elderly.comm.widget;

import com.sun.elderly.comm.ui.interfaces.IFormListener;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View; /**
* 绘制表格
*
* @author jwzhangjie
*/
public class FormView extends View { private int firstX = 0; // 起始点x
private int firstY = 0; // 起始点y
private int secondX = 80; // 第二点x
private int secondY = 50; // 第二点y
private int widthNum = 8; // 列
private int heightNum = 10; // 行
private int secondSideX = 150; // 第二列的宽
private int sideY = 50; // 行高
private int firstSidesX = 80; // 第一列的宽
private int workColor = 0xffADFF2F;
private int restColor = 0xffAD0F2F;
private int selectColor = 0xffAD00FF; private String[] rowText = null;
private String[] colText = null;
private String noData = "-1"; public void setRowAndColText(String[] rowText, String[] colText) {
this.rowText = rowText;
this.colText = colText;
invalidate();
} public SparseArray<String> list = new SparseArray<String>();
private SparseArray<String> backList = new SparseArray<String>(); IFormListener myFormListener; public IFormListener getFormListener() {
return myFormListener;
} public void setFormListener(IFormListener myFormListener) {
this.myFormListener = myFormListener;
} public FormView(Context context) {
super(context);
} public FormView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void init(int width, int height) {
secondSideX = (width - firstSidesX) / (widthNum - 1);
// invalidate();
} public void setList(SparseArray<String> list) {
this.list = list;
backList.clear();// 重置
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (colText != null && rowText != null) {
drawForm(canvas);
}
} private void drawForm(Canvas canvas) {
Paint paint = new Paint(); paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setStyle(Paint.Style.FILL); paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
int cellX = 0, cellY = 0, cellBX = 0, cellBY = 0;
for (int i = 0; i < widthNum; i++){ for (int j = 0; j < heightNum; j++) {
if (i == 0) { // 假设是第一列绘制第一列的宽度
cellX = firstX + i * firstSidesX;
cellY = firstY + j * sideY;
cellBX = firstX + (i + 1) * firstSidesX;
cellBY = firstY + (j + 1) * sideY;
} else {
cellX = secondX + (i - 1) * secondSideX;
cellY = secondY + (j - 1) * sideY;
cellBX = secondX + i * secondSideX;
cellBY = secondY + j * sideY;
} canvas.drawRect(cellX, cellY, cellBX, cellBY, paint);
int cellsNum = i + j * widthNum;
if (j == 0) {
drawCellText(canvas, cellX, cellY, cellBX, cellBY,
rowText[i]);
}
if (cellsNum % widthNum != 0) {
if (!noData.equals(list.get(cellsNum, noData))) {
if (list.get(cellsNum).equals("0")) {
drawCellColor(canvas, cellX, cellY, cellBX, cellBY,
workColor);
} else {
drawCellColor(canvas, cellX, cellY, cellBX, cellBY,
restColor);
}
} else if (!noData.equals(backList.get(cellsNum, noData))) {
drawCellColor(canvas, cellX, cellY, cellBX, cellBY,
selectColor);
} else {
drawCellColor(canvas, cellX, cellY, cellBX, cellBY,
0xFFF);
}
} else {// 绘制第一列
drawCellText(canvas, cellX, cellY, cellBX, cellBY,
colText[cellsNum / widthNum]);
}
}
}
} // 绘制单元格中的文字
private void drawCellText(Canvas canvas, int cellX, int cellY, int cellBX,
int cellBY, String text) {
Paint paint = new Paint();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
int textSize = (cellBY - cellY) / 5 * 2;
paint.setTextSize(textSize);
int textX = cellX + (cellBX - cellX) / 10;
int textY = cellBY - (cellBY - cellY) / 3;
canvas.drawText(text, textX, textY, paint);
} // 绘制单元格中的颜色
private void drawCellColor(Canvas canvas, int cellX, int cellY, int cellBX,
int cellBY, int color) {
Paint paint = new Paint();
// 绘制备选颜色边框以及当中颜色
paint.setColor(color);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(cellX + 1, cellY + 1, cellBX - 1, cellBY - 1, paint);
} @SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) { float touchX = event.getX();
float touchY = event.getY(); int antion = event.getAction();
if (antion == MotionEvent.ACTION_DOWN) {
testTouchColorPanel(touchX, touchY);
}
return super.onTouchEvent(event);
} // 检測点击事件所在的格数
public boolean testTouchColorPanel(float x, float y) {
if (x > secondX && y > secondY
&& x < firstX + firstSidesX + secondSideX * widthNum
&& y < firstY + sideY * heightNum) { int ty = (int) ((y - firstY) / sideY);
int tx; if (x - firstX - firstSidesX > 0) {
tx = (int) ((x - firstX - firstSidesX) / secondSideX + 1);
} else {
tx = 0;
}
int index = ty * widthNum + tx;
if (noData.equals(list.get(index, noData))) {
if (!noData.equals(backList.get(index, noData))) {
backList.remove(index);
myFormListener.showNum(index, 1);
} else {
backList.put(index, "2");
myFormListener.showNum(index, 2);
}
invalidate();
} else {
myFormListener.showNum(index, 0);
}
return true;
}
return false;
}
}

主界面DrawFormActivity:

package com.sun.elderly.test;

import com.sun.elderly.R;
import com.sun.elderly.comm.ui.interfaces.IFormListener;
import com.sun.elderly.comm.widget.FormView; import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.SparseArray;
import android.view.ViewTreeObserver;
import android.widget.Toast; public class DrawFormActivity extends FragmentActivity implements IFormListener { private FormView myFormView;
private SparseArray<String> list = new SparseArray<String>();
private String[] rowText = { "", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
"星期日" };
private String[] colText = { "", "9:00", "10:00", "11:00", "12:00",
"13:00", "14:00", "15:00", "16:00", "17:00" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("工作表");
setContentView(R.layout.test_drawform);
myFormView = (FormView) findViewById(R.id.formId);
list.put(12, "0");// key:位置 ,value:0--已经预约 1--歇息时间 2--预备预约占用
list.put(18, "1");
list.put(19, "1");
list.put(21, "0");
list.put(33, "0");
list.put(46, "1");
myFormView.setList(list);
myFormView.setFormListener(this);
ViewTreeObserver vto = myFormView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
myFormView.getViewTreeObserver().removeOnPreDrawListener(this);
int height = myFormView.getMeasuredHeight();
int width = myFormView.getMeasuredWidth();
myFormView.init(width, height);
myFormView.setRowAndColText(rowText, colText);
return true;
}
});
} @Override
public void showNum(int num, int status) {
switch (status) {
case 0:
showInfo(num + "当前时间已经被占用");
break;
case 1:
showInfo("取消选择:" + num);
break;
case 2:
showInfo("选择工作时间: " + num);
break;
}
} private void showInfo(String text) {
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT)
.show();
}
}

布局test_drawform:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <com.sun.elderly.comm.widget.FormView
android:id="@+id/formId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dip"
/> </LinearLayout>

显示效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvand6aGFuZ2ppZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvand6aGFuZ2ppZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

http://jwzhangjie.com/workplan.gif

安卓使用Canvas绘制工作日程表的更多相关文章

  1. canvas 绘制刮刮卡

    思路=> 用div来展示刮奖结果,用canvas绘制刮奖前展示的图片或者文字:将canvas叠在div上方,刮奖是只需要操作canvas配合touch事件即可简单完成. canvas刮奖可以用g ...

  2. HTML5学习总结——canvas绘制象棋(canvas绘图)

    一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...

  3. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 封装 用canvas绘制直线的函数--面向对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  6. canvas绘制经典折线图(一)

    最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...

  7. Canvas绘制图形

    1.Canvas绘制一个蓝色的矩形 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  8. [canvas]利用canvas绘制自适应的折线图

    前段时间学习了用canvas绘制折现图,且当画布变换大小,折现图会随之变化,现附上代码 <!DOCTYPE html> <html lang="en"> & ...

  9. 使用Canvas绘制背景图

    原文  http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...

随机推荐

  1. python之版本管理

    linux 环境下怎样对不同的python环境进行 方便的切换呢?update-alternatives工具能够非常方便的帮我们完成这个任务.而windows环境下可通过anaconda来完成. 1. ...

  2. Qt pro文件语法

    在Qt下做开发的时候.pro文件就是工程的配置文件,虽然很多时候里面的选项是工具自动生成的,但是难免会需要手动修改的时候,下面就记录一下它的基本语法 #:在.pro文件中表示注释,注释当前行 TEMP ...

  3. 【iOS越狱开发】如何将应用打包成.ipa文件

    在项目开发中,我们常常需要将工程文件打包成.ipa文件,提供给越狱的iphone安装. 下面是一种方法: 1.首先应该给工程安装好配置文件(这里不再敖述),在ios device的状态下,运行成功. ...

  4. oracle 存储过程中使用date 时、分、秒丢失

    今天有一开发兄弟找我.说出现一奇怪现象,在存储过程中赋date类型的值,时.分.秒都丢失了,以下来做个试验: SQL> drop table test purge; SQL> create ...

  5. HashMap与TreeMap的区别?

    HashMap与TreeMap的区别? 解答:HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用Tre ...

  6. SpringBoot新增监听器Listener

    什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建 ...

  7. Node.js 入门 资源

    Node.js 入门 <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm ...

  8. 解决Ajax请求跨域问题

    from:https://blog.csdn.net/wang379275614/article/details/53333775 上篇文章提到,由于浏览器的同源策略,使得,AJAX请求只能发给同源的 ...

  9. LNK2005 _DllMain@12 mfcs100d.lib

    起因是将之前使用 MFC 规则 DLL 的动态库都改为了 MFC 扩展 DLL,在将动态库中从 CWinApp 继承的类替换为 DllMain 函数后,就出现 LNK2005 错误,说 DllMain ...

  10. MVC、MVP、MVVM

    1 简介 演变:MVC ——> MVP ——> MVVM 英文原文:MVC vs. MVP vs. MVVM 三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform ...