安卓开发之自定义控件实现画板
来源:互联网 发布:组策略禁止软件运行 编辑:程序博客网 时间: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
- 安卓开发之自定义控件实现画板
- 安卓开发之自定义控件实现MaterialEditText
- 安卓开发之自定义控件实现MaterialEditText
- 安卓开发之自定义粒子旋转动画加载控件
- 安卓开发之使用PathMeasure自定义加载动画控件
- android 自定义控件 -- 画板
- 安卓自定义组合控件的实现
- 安卓自定义控件之饼图
- 安卓自定义控件之仪表盘
- 安卓自定义控件之折线图
- 安卓开发学习之017 自定义控件之属性获取
- 【安卓自定义控件系列】安卓自定义控件之组合控件
- 初探安卓画板
- 安卓画板
- 安卓几何画板
- 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)
- 自定义安卓控件
- 安卓----自定义控件
- 首发|创业3年半,做8款App全部扑街;转做公众号5个月,零成本吸粉12万还拿了百万天使轮
- 主元素、主元素II、主元素III
- sql server 2008数据库连接失败,解决方法
- 几何-BZOJ-1610-[Usaco2008 Feb]Line连线游戏
- linux命令
- 安卓开发之自定义控件实现画板
- SharePoint 轻量化应用之结果通知和入职通知&三试通知
- access
- [Android教程] Android系统自定义实现日历控件
- Adobe Illustrator CS5 (AI软件) 免费精简中文版
- C++实现string类字符串单词的逆序输出
- C#枚举简述
- xcode的indexing功能取消,出现无法command点击跳转方法,代码变白的解决办法
- android xml布局之———include.merge.ViewStub