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

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

因使用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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值