Android使用SurfaceView实现签名板
Posted kiba518
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android使用SurfaceView实现签名板相关的知识,希望对你有一定的参考价值。
SurfaceView使用
首先创建一个SurfaceViewSign类,继承SurfaceView类,继承 SurfaceHolder.Callback和Runnable接口,代码如下:
import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class SurfaceViewSign extends SurfaceView implements SurfaceHolder.Callback,Runnable //SurfaceHolder private SurfaceHolder holder; //用于绘图的Canvas private Canvas canvas; //子线程标志位 private boolean isDrawing; //画笔 private Paint paint; //路径 private Path path; private Bitmap bitmap; private Canvas getCanvas; /** * 获取mCanvas里的bitmap * */ public Bitmap getBitmap() getCanvas.drawColor(Color.WHITE);//画布背景色 getCanvas.drawPath(path, paint); getCanvas.save(); getCanvas.restore(); return bitmap; //region bitmap压缩到文件 // File file = new File(Environment.getExternalStorageDirectory().getPath() + "/share_pic.png");// 保存到sdcard根目录下,文件名为share_pic.png // FileOutputStream fos = null; // try // fos = new FileOutputStream(file); // bitmap.compress(Bitmap.CompressFormat.PNG, 50, fos); // // catch (FileNotFoundException e) // // TODO Auto-generated catch block // e.printStackTrace(); // // try // fos.close(); // catch (IOException e) // // TODO Auto-generated catch block // e.printStackTrace(); // //endregion public SurfaceViewSign(Context context) super(context); initView(); public SurfaceViewSign(Context context, AttributeSet attrs) super(context, attrs); initView(); public SurfaceViewSign(Context context, AttributeSet attrs, int defStyleAttr) super(context, attrs, defStyleAttr); initView(); private void initView() bitmap = Bitmap.createBitmap(1000,1000, Bitmap.Config.ARGB_8888); getCanvas = new Canvas(bitmap); holder = getHolder(); //添加回调 holder.addCallback(this); path =new Path(); //初始化画笔 paint =new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(6); paint.setAntiAlias(true); paint.setColor(Color.RED);//画笔颜色 setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); //Surface的生命周期 @Override public void surfaceCreated(SurfaceHolder holder) isDrawing =true; new Thread(this).start(); @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) @Override public void surfaceDestroyed(SurfaceHolder holder) isDrawing =false; @Override public void run() long start =System.currentTimeMillis(); while(isDrawing) draw(); long end = System.currentTimeMillis(); if(end-start<100) try Thread.sleep(100-end+start); catch (InterruptedException e) e.printStackTrace(); private void draw() try //锁定画布并返回画布对象 canvas = holder.lockCanvas(); canvas.drawColor(Color.WHITE);//设置画布背景色 canvas.drawPath(path, paint); //画线 catch (Exception e) finally if(canvas !=null) holder.unlockCanvasAndPost(canvas);//解锁 /** * 绘制触摸滑动路径 * @param event MotionEvent * @return true */ @Override public boolean onTouchEvent(MotionEvent event) int x=(int) event.getX(); int y= (int) event.getY(); switch (event.getAction()) case MotionEvent.ACTION_DOWN: path.moveTo(x,y); break; case MotionEvent.ACTION_MOVE: path.lineTo(x,y); break; case MotionEvent.ACTION_UP: break; return true; /** * 清屏 * @return true */ public boolean reDraw() path.reset(); return true;
然后创建一个测试Activity,然后编写他的页面代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" android:background="@color/white" tools:ignore="MissingClass"> <com.kiba.test.control.surfaceview.SurfaceViewSign android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/red"></View> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" ></ImageView> </LinearLayout>
然后在activity里编写点击事件如下:
@SingleClick @OnClick(R.id.imageView) public void ImageClick() Bitmap bitmap =sv.getBitmap(); imageView.setImageBitmap(bitmap); imageView2.setImageBitmap(bitmap);
这样就实现了简单的签名,并且获取到了签名的图片,类型是bitmap。
效果图如下:
----------------------------------------------------------------------------------------------------
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!
https://www.cnblogs.com/kiba/
以上是关于Android使用SurfaceView实现签名板的主要内容,如果未能解决你的问题,请参考以下文章