Android DIY之路 (三) 手绘 仅在限定区域留下痕迹 并再现这一过程
来源:互联网 发布:网络预约驾驶员资格证 编辑:程序博客网 时间:2024/06/10 04:25
今天介绍一个比较简单的功能手绘。但想做一个再现过程的。但不知道如何去保存当事人画的实际变速度和 不连贯的地方。欢迎大家讨论
原谅我 就是不喜欢提供DEMO 哈
package com.rexviewforchildcandrag;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.Handler;import android.os.Message;import android.os.SystemClock;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;/** * Created by Rex on 2016/9/30. */public class DrawView extends View { private Paint p; private float downX; private float downY; private float moveX; private float moveY; private Paint paint; private Canvas cacheCanvas; private Bitmap cachebBitmap; private Path path; private int clr_bg, clr_fg; private boolean isMoving; private int width; private int height; private boolean isTrans = false; private Path lastPath = null; private List<Path> lastPaths = new ArrayList<>(); private List<float[]> lasts = new ArrayList<>(); private int i; private boolean isShowing; public DrawView(Context context) { this(context, null, 0); } public DrawView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { p = new Paint(); p.setStyle(Paint.Style.STROKE); p.setStrokeWidth(10); p.setColor(Color.parseColor("#EB7A77")); path = new Path(); // 创建一张屏幕大小的位图,作为缓冲 reset(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); width = w; height = h; } @Override protected void onDraw(Canvas canvas) { Log.i("rex", "moveX " + moveX + "moveY " + moveY); canvas.drawColor(Color.GREEN); if (!isTrans) { isTrans = true; cacheCanvas.translate(-(width - cachebBitmap.getWidth()) * 1f / 2, -(height - cachebBitmap.getHeight()) * 1f / 2); } // 绘制上一次的,否则不连贯 if (null != cachebBitmap) canvas.drawBitmap(cachebBitmap, (width - cachebBitmap.getWidth()) * 1f / 2, (height - cachebBitmap.getHeight()) * 1f / 2, null); canvas.drawPath(path, p); } public void clear() { reset(); invalidate(); } public void reset() { cachebBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888); cacheCanvas = new Canvas(cachebBitmap); cacheCanvas.drawColor(Color.GRAY); lastPath = new Path(); lastPath.addPath(path); path.reset(); isTrans = false; } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { Log.i("rex", "Message" + Thread.currentThread()); cacheCanvas.drawPath(path, p); path.reset(); invalidate(); super.handleMessage(msg); switch (msg.what) { case 0: break; default: break; } } }; public void showLastPath() { path.moveTo(lasts.get(0)[0], lasts.get(0)[1]); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i < lasts.size(); i++) { if (i == lasts.size() - 1) { cacheCanvas.drawPath(path, p); path.reset(); postInvalidate(); return; } isShowing = true; path.quadTo(lasts.get(i - 1)[0], lasts.get(i - 1)[1], lasts.get(i)[0], lasts.get(i)[1]); SystemClock.sleep(50);// mHandler.sendMessage(mHandler.obtainMessage(0)); postInvalidate(); } } }).start(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); path.moveTo(downX, downY); isMoving = true; lasts.add(new float[]{downX, downY}); break; case MotionEvent.ACTION_MOVE: moveX = event.getX(); moveY = event.getY(); if (!isMoving) break; // 二次曲线方式绘制 path.quadTo(downX, downY, moveX, moveY); downX = moveX; downY = moveY; lasts.add(new float[]{downX, downY}); break; case MotionEvent.ACTION_UP: cacheCanvas.drawPath(path, p); path.reset(); isMoving = false; break; } invalidate(); return true; }}
0 0
- Android DIY之路 (三) 手绘 仅在限定区域留下痕迹 并再现这一过程
- Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等
- Android DIY之路 (二) 编辑素材图 提供拖拽替换指定区域
- Android编程之手绘
- 让我的脚步在这里留下痕迹
- java Cookie实战教程之留下的痕迹
- 留下好的痕迹
- 总得留下点痕迹
- 2013.3.6留下痕迹
- Unity3D 类似COC的鼠标拾取游戏物体并在限定区域摆放
- Android编程之手绘 ,画图
- 留下一点儿痕迹……
- Python进阶之网络通信过程再现
- 求教,如何通过转动手机控制一个黑点移动,并留下痕迹
- 互联网的江湖:十年轮回,借江山一用,可曾留下痕迹
- 象往常一样 继续在网上留下自己飘过的痕迹
- Android之再现Adapter用法总结
- opencv之颜色过滤只留下图片中的红色区域
- 模拟Home键效果
- android访问权限大权
- php基础(三)
- iOS-APP集成Apple Pay指南-赵鹏举
- Java以UTF-8编码读写文件
- Android DIY之路 (三) 手绘 仅在限定区域留下痕迹 并再现这一过程
- 从ActionBar到ToolBar你用了多久(一)
- easyui
- 使用CheckedOutputStream和CheckedInputStream实现带验证的压缩、解压
- Java 不同路径下加载文件
- sql server 查询最近备份记录
- linux 中 oracle dmp文件导入
- Weblogic报错Authentication denied: Boot identity not valid
- SmartImageView框架使用