Android實現手寫板和塗鴉功能

來源:互聯網
上載者:User

Android實現手寫板和塗鴉功能

下面仿一個Android手寫板和塗鴉的功能,直接上代碼:

write_pad.xml

 

    <framelayout android:id="@+id/tablet_view" android:layout_height="300dp" android:layout_width="fill_parent">    </framelayout>    

 

這個是手寫板的主要布局檔案,能夠手寫的部分是一個FrameLayout。下面有確定、清除和取消按鈕,用來儲存和擦除簽名。

 

主要代碼邏輯如下:

MainActivity.java

package com.jackie.handwriting;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends Activity {private ImageView mIVSign;private TextView mTVSign;private Bitmap mSignBitmap;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mIVSign = (ImageView) findViewById(R.id.iv_sign);mTVSign = (TextView) findViewById(R.id.tv_sign);mTVSign.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {WritePadDialog mWritePadDialog = new WritePadDialog(MainActivity.this, new WriteDialogListener() {@Overridepublic void onPaintDone(Object object) {mSignBitmap = (Bitmap) object;createSignFile();mIVSign.setImageBitmap(mSignBitmap);mTVSign.setVisibility(View.GONE);}});mWritePadDialog.show();}});}//建立簽名檔案private void createSignFile() {        ByteArrayOutputStream baos = null;        FileOutputStream fos = null;        String path = null;          File file = null;        try {              path = Environment.getExternalStorageDirectory() + File.separator + System.currentTimeMillis() + ".jpg";             file = new File(path);            fos = new FileOutputStream(file);            baos = new ByteArrayOutputStream();            //如果設定成Bitmap.compress(CompressFormat.JPEG, 100, fos) 圖片的背景都是黑色的            mSignBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);              byte[] b = baos.toByteArray();              if (b != null) {                  fos.write(b);             }          } catch (IOException e) {              e.printStackTrace();          } finally {              try {                  if (fos != null) {                fos.close();                }                if (baos != null) {                baos.close();                }            } catch (IOException e) {                  e.printStackTrace();              }          }  }}

 

PaintView.java

package com.jackie.handwriting;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.view.MotionEvent;import android.view.View;public class PaintView extends View {private Paint mPaint;private Path mPath;private Bitmap mBitmap;private Canvas mCanvas;private int screenWidth, screenHeight;private float currentX, currentY;public PaintView(Context context, int screenWidth, int screenHeight) {super(context);this.screenWidth = screenWidth;this.screenHeight = screenHeight;init();}private void init() {mPaint = new Paint();mPaint.setAntiAlias(true); // 去除鋸齒mPaint.setStrokeWidth(5);mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(Color.BLACK);mPath = new Path();mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888);mCanvas = new Canvas(mBitmap);//mCanvas.drawColor(Color.WHITE);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(mBitmap, 0, 0, null);canvas.drawPath(mPath, mPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:currentX = x;currentY = y;mPath.moveTo(currentX, currentY);break;case MotionEvent.ACTION_MOVE:currentX = x;currentY = y;mPath.quadTo(currentX, currentY, x, y); // 畫線break;case MotionEvent.ACTION_UP:mCanvas.drawPath(mPath, mPaint);break;}invalidate();return true;}public Bitmap getPaintBitmap() {return resizeImage(mBitmap, 320, 480);}public Path getPath() {return mPath;}// 縮放public static Bitmap resizeImage(Bitmap bitmap, int width, int height) {int originWidth = bitmap.getWidth();int originHeight = bitmap.getHeight();float scaleWidth = ((float) width) / originWidth;float scaleHeight = ((float) height) / originHeight;Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, originWidth,originHeight, matrix, true);return resizedBitmap;}//清除畫板public void clear() {if (mCanvas != null) {mPath.reset();mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);            invalidate();}}}

 

WritePadDialog.java

 

package com.jackie.handwriting;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.View;import android.view.Window;import android.widget.Button;import android.widget.FrameLayout;import android.widget.Toast;public class WritePadDialog extends Dialog {private Context mContext;private WriteDialogListener mWriteDialogListener;private PaintView mPaintView;private FrameLayout mFrameLayout;private Button mBtnOK, mBtnClear, mBtnCancel;public WritePadDialog(Context context,WriteDialogListener writeDialogListener) {super(context);this.mContext = context;this.mWriteDialogListener = writeDialogListener;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); //無標題setContentView(R.layout.write_pad);mFrameLayout = (FrameLayout) findViewById(R.id.tablet_view);// 擷取螢幕尺寸DisplayMetrics mDisplayMetrics = new DisplayMetrics();getWindow().getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);int screenWidth = mDisplayMetrics.widthPixels;int screenHeight = mDisplayMetrics.heightPixels;mPaintView = new PaintView(mContext, screenWidth, screenHeight);mFrameLayout.addView(mPaintView);mPaintView.requestFocus();mBtnOK = (Button) findViewById(R.id.write_pad_ok);mBtnOK.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mPaintView.getPath().isEmpty()) {Toast.makeText(mContext, "請寫下你的大名", Toast.LENGTH_SHORT).show();return;}mWriteDialogListener.onPaintDone(mPaintView.getPaintBitmap());dismiss();}});mBtnClear = (Button) findViewById(R.id.write_pad_clear);mBtnClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mPaintView.clear();}});mBtnCancel = (Button) findViewById(R.id.write_pad_cancel);mBtnCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {cancel();}});}}

 

WriteDilogListener.java

 

package com.jackie.handwriting;/** * 監聽手寫板對話方塊 * @author chengcj1 *  */public interface WriteDialogListener {public void onPaintDone(Object object);}

 

效果如下:

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.