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,然后编写他的页面代码如下:

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">

android:id="@+id/sv"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

/>

android:layout_width="match_parent"

android:layout_height="1dp"

android:background="@color/red">

android:id="@+id/imageView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

>

然后在activity里编写点击事件如下:

@SingleClick

@OnClick(R.id.imageView)

public void ImageClick()

{

Bitmap bitmap =sv.getBitmap();

imageView.setImageBitmap(bitmap);

imageView2.setImageBitmap(bitmap);

}

这样就实现了简单的签名,并且获取到了签名的图片,类型是bitmap。

效果图如下:

 

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

 

 

查看原文