安卓开发之自定义控件实现画板

来源:互联网 发布:组策略禁止软件运行 编辑:程序博客网 时间:2024/05/16 08:41

只实现了画板的绘制,画板的清除,画板的撤销(返回上一步)、保存文件。

因使用SurfaceView保存的图片一片黑,重新使用View来绘制,可保存图片。如果可以保存SurfaceView为文件的方法,麻烦告知一下


代码:

package com.cxmscb.cxm.newtest;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.os.Environment;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.Toast;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;/** * Created by cxm on 2016/10/12. */public class DrawBoard extends View implements View.OnTouchListener {    private Paint paint = new Paint();    private Path path = new Path();    //存储笔画    private ArrayList<Path> paths = new ArrayList<Path>();    /**     * 保存上一次绘制的终点横坐标     */    private float pX;    /**     * 保存上一次绘制的终点纵坐标     */    private float pY;    public DrawBoard(Context context, AttributeSet attrs) {        super(context, attrs);        setOnTouchListener(this);        paint.setAntiAlias(true);        paint.setDither(true);        paint.setColor(Color.BLACK);        paint.setStrokeWidth(4.0f);        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeJoin(Paint.Join.ROUND);// 设置外边缘        paint.setStrokeCap(Paint.Cap.SQUARE);// 形状    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawColor(Color.WHITE);        for (int i = 0; i < paths.size(); i++) {            canvas.drawPath(paths.get(i), paint);        }    }    //清除画板    public void clear() {        for (int i = 0; i < paths.size(); i++) {            paths.get(i).reset();        }        paths.clear();        invalidate();    }    //撤销,返回上一步    public void goBack() {        if (paths.size() >= 1) {            path = paths.get(paths.size() - 1);            path.reset();            paths.remove(paths.size() - 1);        }        invalidate();    }    // 最好在子线程中调用    public void save(String filePath) throws IOException {        this.setDrawingCacheEnabled(true);        //截图        Bitmap bitmap = this.getDrawingCache();        if (bitmap != null) {            //保存            saveBitmapForSdCard(bitmap,filePath);            Toast.makeText(getContext(), "保存成功", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(getContext(), "截图失败", Toast.LENGTH_SHORT).show();        }    }    private void saveBitmapForSdCard(Bitmap bitmap,String filePath) {        //创建file对象        File f = new File(filePath);        //创建        if(f.exists()){            f.delete();        }        FileOutputStream fOut = null;        try {            fOut = new FileOutputStream(f);        } catch (FileNotFoundException e) {            e.printStackTrace();        }        //原封不动的保存在内存卡上        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);        try {            fOut.flush();        } catch (IOException e) {            e.printStackTrace();        }        try {            fOut.close();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                path = new Path();                paths.add(path);                path.moveTo(event.getX(), event.getY());                pX = event.getX();                pY = event.getY();                invalidate();                break;            case MotionEvent.ACTION_MOVE:                path.quadTo(pX,pY,event.getX(), event.getY());                //quadTo比lineTo更润滑                pX = event.getX();                pY = event.getY();                invalidate();                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }}
0 1
原创粉丝点击