安卓使用Canvas繪製工作議程表,安卓canvas

來源:互聯網
上載者:User

安卓使用Canvas繪製工作議程表,安卓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; // 起始點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


安卓 view 怎在ondraw外使用canvas繪圖

你應該在ontouchevent中設定標識並重新整理控制項,在onDraw方法雷根據標識繪圖。
 
安卓 view 怎在ontouchevent中使用canvas

你應該在ontouchevent中設定標識並重新整理控制項,在onDraw方法雷根據標識繪圖。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.