安卓使用Canvas绘制工作日程表

来源:互联网 发布:算命的为何准 知乎 编辑:程序博客网 时间:2024/06/05 04:37

有一个项目要使用工作表,选择使用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; // 起始点xprivate int firstY = 0; // 起始点yprivate int secondX = 80; // 第二点xprivate int secondY = 50; // 第二点yprivate 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();// 重置}@Overrideprotected 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")@Overridepublic 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" };@Overrideprotected 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;}});}@Overridepublic 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>

显示效果:







http://jwzhangjie.com/workplan.gif

0 1
原创粉丝点击