入门surfaceView实现画图板
来源:互联网 发布:最好的拼图软件 编辑:程序博客网 时间:2024/06/07 13:59
出处
http://www.jianshu.com/p/15060fc9ef18
效果图
代码
package com.qunar.yuzhiyun.surfaceviewdrawsomething;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;/** * Created by yuzhiyun on 17/11/7. */public class SurfaceViewL extends SurfaceView implements SurfaceHolder.Callback, Runnable { // SurfaceHolder private SurfaceHolder mSurfaceHolder; // 画布 private Canvas mCanvas; // 子线程标志位 private boolean isDrawing; // 画笔 Paint mPaint; // 路径 Path mPath; private float mLastX, mLastY;//上次的坐标 public SurfaceViewL(Context context, AttributeSet attrs) { super(context, attrs); init(); } /** * 初始化 */ private void init() { //初始化 SurfaceHolder mSurfaceHolder mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); //画笔 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); mPaint.setStrokeWidth(10f); mPaint.setColor(Color.parseColor("#FF4081")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); //路径 mPath = new Path(); } @Override public void surfaceCreated(SurfaceHolder holder) {//创建 Log.i("surfaceCreated","--"+isDrawing); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//改变 } @Override public void surfaceDestroyed(SurfaceHolder holder) {//销毁 isDrawing = false; Log.i("surfaceDestroyed","--"+isDrawing); } @Override public void run() { while (isDrawing){ drawing(); } } /** * 绘制 */ private void drawing() { try { mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawColor(Color.WHITE); mCanvas.drawPath(mPath,mPaint); } finally { if (mCanvas != null) { mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isDrawing = true ;//每次开始将标记设置为ture new Thread(this).start();//开启线程 mLastX = x; mLastY = y; mPath.moveTo(mLastX, mLastY); break; case MotionEvent.ACTION_MOVE: float dx = Math.abs(x - mLastX); float dy = Math.abs(y - mLastY); if (dx >= 3 || dy >= 3) { mPath.quadTo(mLastX, mLastY, (mLastX + x) / 2, (mLastY + y) / 2); } mLastX = x; mLastY = y; break; case MotionEvent.ACTION_UP: isDrawing = false; break; } return true; }}
阅读全文
0 0
- 入门surfaceView实现画图板
- surfaceview画图板的简单使用
- Android入门,简单画图板的实现,自定义组件的实现
- JavaScript 实现画图板效果
- wxPython实现的画图板
- 画图板铅笔的实现
- 画图板的实现
- 画图板的简单实现
- 画图板的简单实现
- 画图板简单实现
- QPainter实现画图板原型
- java简单画图板实现
- 画图板
- 画图板
- 画图板
- 画图板
- 画图板
- 画图板
- TCP/IP
- MUI 页面切换时等待动画怎么设置?
- 导航页下拉菜单
- 【论文笔记】Margin Sample Mining Loss: A Deep Learning Based Method for Person Re-identification
- bzoj 1061 [Noi2008]志愿者招募 单纯形算法
- 入门surfaceView实现画图板
- Cassandra
- Linux命令-自动挂载文件/etc/fstab功能详解
- Django: OperationalError / no such table
- linux下安装Redis
- Qt label自适应窗体大小
- NOIP模拟(11.06)T2 序列操作
- Javascript正则表达式把所有空格替换为指定字符
- 理解hadoop生态环境