Android 程式 -- 手寫繪圖板

Android

簡介

使用方法

開發工具

開始寫程式

視覺化介面

視覺元件

對話元件

核心物件

事件處理

資料儲存

查詢功能

影音功能

繪圖功能

網路功能

衛星地圖

特殊功能

資源管理

裝置管理

系統核心

問題與回答

刷機升級

常用軟體

Eclipse

教學錄影

訊息

相關網站

參考文獻

最新修改

簡體版

English

專案下載:DrawBoard.zip — 簡單手寫板,但是不能正確顯示兩筆劃以上的手寫。
專案下載:DrawBoard2.zip — 簡單手寫板,可以正確顯示兩筆劃以上的手寫。

執行結果

DrawBoardRun.png

程式範例:DrawBoard.java

package ccc.android;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.View;
 
public class DrawBoard extends Activity {
    public static final int openFile = 1, newFile = 2, saveFile = 3, help=4;
    List<PointF> points = new ArrayList<PointF>();
    Panel mPanel;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPanel = new Panel(this);
        setContentView(mPanel);
    }
 
    class Panel extends View {
        Paint mPaint = new Paint();
 
        public Panel(Context context) {
            super(context);
            mPaint.setColor(Color.YELLOW);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(3);
        }
 
        @Override
        public void onDraw(Canvas canvas) {
            for (int i=1; i<points.size();i++) {
                canvas.drawLine(points.get(i-1).x,points.get(i-1).y, 
                      points.get(i).x,points.get(i).y, mPaint);
            }
        }
 
        @Override
        public boolean onTouchEvent(android.view.MotionEvent event) {
            for (int i = 0; i < event.getHistorySize(); i++) {
                points.add(new PointF(event.getHistoricalX(i), event.getHistoricalY(i)));
            }
            Panel.this.invalidate();
            return true; // 代表該事件已被處理,不再向上傳遞了。
        };
    }
}

問題:無法處理兩筆劃以上的情形,因此我們修改上述程式,以處理兩筆劃以上的情形。

第二版

package ccc.android;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
 
public class DrawBoard extends Activity {
    public static final int menuClear = 1;
    List<PointF> points = new ArrayList<PointF>();
    Panel mPanel;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPanel = new Panel(this);
        setContentView(mPanel);
    }
 
    public boolean onCreateOptionsMenu(Menu menu) {
        // menu.add 參數: (int groupId, int itemId, int order, int titleRes)
        menu.add(0, menuClear, 0, "清除");
        return true;
    }
 
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case menuClear: 
              points.clear();
              mPanel.invalidate();
              break;
        }
        return true;
    }
 
    class Panel extends View {
        Paint mPaint = new Paint();
 
        public Panel(Context context) {
            super(context);
            mPaint.setColor(Color.YELLOW);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(3);
        }
 
        @Override
        public void onDraw(Canvas canvas) {
            for (int i=1; i<points.size();i++) {
              PointF p1 = points.get(i-1);
              PointF p2 = points.get(i);
              if (Math.abs(p1.x - p2.x) < 20 
               && Math.abs(p1.y - p2.y) < 20) { 
                  canvas.drawLine(p1.x,p1.y, p2.x, p2.y, mPaint);
              }
            }
        }
 
        @Override
        public boolean onTouchEvent(android.view.MotionEvent event) {
            for (int i = 0; i < event.getHistorySize(); i++) {
                points.add(new PointF(event.getHistoricalX(i), event.getHistoricalY(i)));
            }
            Panel.this.invalidate();
            return true; // 代表該事件已被處理,不再向上傳遞了。
        };        
    }
}

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License