安卓使用Canvas绘制工作日程表
有一个项目要使用工作表,选择使用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="" />
安卓使用Canvas绘制工作日程表的更多相关文章
- canvas 绘制刮刮卡
思路=> 用div来展示刮奖结果,用canvas绘制刮奖前展示的图片或者文字:将canvas叠在div上方,刮奖是只需要操作canvas配合touch事件即可简单完成. canvas刮奖可以用g ...
- HTML5学习总结——canvas绘制象棋(canvas绘图)
一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...
- 用canvas绘制折线图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 封装 用canvas绘制直线的函数--面向对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习笔记:HTML5 Canvas绘制简单图形
HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...
- canvas绘制经典折线图(一)
最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...
- Canvas绘制图形
1.Canvas绘制一个蓝色的矩形 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
- [canvas]利用canvas绘制自适应的折线图
前段时间学习了用canvas绘制折现图,且当画布变换大小,折现图会随之变化,现附上代码 <!DOCTYPE html> <html lang="en"> & ...
- 使用Canvas绘制背景图
原文 http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...
随机推荐
- 使用Nginx Lua实现redis高性能http接口
使用Nginx Lua实现redis高性能http接口 时间 -- :: 峰云就她了 原文 http://xiaorui.cc/2015/01/27/使用nginx-lua实现redis高性能http ...
- iOS直播-基于RTMP的视频推送
iOS直播-基于RTMP的视频推送 所谓的视频推送就是把摄像头和麦克风捕获到视频和音频推送到直播服务器上.我们这里使用推送协议是RTMP协议. 扩展:腾讯直播平台,阿里直播平台,百度直播平台提供均为R ...
- PHP学习笔记(6)js点击刷新验证码
用“换一张”来控制验证码刷新,js脚本怎么写 宏朋雄 | 浏览 3663 次 2012-06-11 22:41 2012-06-12 01:49 最佳答案 <img src=“验证码文 ...
- RxBinding -- 官网说明
RxBinding -- 官网说明 新建 模板 小书匠 作用 组件 平台绑定 support-v4 绑定 appcompact-v7 绑定 design 库绑定 recyclerview-v7 绑定 ...
- SlidingMenu.jar 抽屉使用,避免了使用libaray的不兼容的尴尬
尽管说这个东西出来了一段时间了,可是好东西还是要分享一下的. 之前我们使用的都是libaray.各种出错.团队开发也不好操作.不知道 哪个好心人干脆把这个工具封装成一个jar,真心为你点赞. ...
- 质问微软 WP8.1开发HTTPS 真费劲
本人用C#多年,WPF2年,一直想做点应用为WP生态贡献一点力量,最近终于有机会接触了 家里的本子是2年前的低压I3,不支持虚拟化,一直没有真机.最近同事妈妈换下来一个820给我拿来做开发用,非常感谢 ...
- 全栈JavaScript之路(十四)HTML5 中与class属性相关的扩充
1. getElementByClassName() :支持getElementsByClassName()方法的浏览器有IE 9+.Firefox 3+.Safari 3.1+.Chrome 和 O ...
- Tensorflow之改变tensor形状
https://www.tensorflow.org/versions/r0.12/api_docs/python/array_ops.html#reshape 例子: # tensor 't' is ...
- 类加载器(ClassLoader)
静态库.动态连接库 程序编制一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件:在连接步骤中,连接器将从库文件取得所需的代码,复制 ...
- MFC中CString转换成char数组的问题
由于结构体中用到联合体(联合体需要确定分配内存分配大小)或其它因素,需要用char数组来保存字符串,但是在MFC中一般都是用CString来存放字条串.关于它们之间的转换,在VS2008中有时会出现异 ...