SurfaceView绘制触摸轨迹闪烁问题的最终解决方案
来源:互联网 发布:淘宝延长收货是几天 编辑:程序博客网 时间:2024/06/16 17:00
package com.tobacco.touchdraw;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnTouchListener;
public class LSurfaceView extends SurfaceView implements Callback,OnTouchListener,Runnable{
private SurfaceHolder sfh;
private Canvas canvas;
private Paint paint;
private Path path;
private ArrayList<Path> paths;
private boolean flag;
public LSurfaceView(Context context) {
super(context);
sfh=this.getHolder();
sfh.addCallback(this);
paint=new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStrokeWidth(4);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeCap(Paint.Cap.ROUND);
paths=new ArrayList<Path>();
path=new Path();
}
public void myDraw(MotionEvent e){
int action=e.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
path.moveTo(e.getX(),e.getY());
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(e.getX(),e.getY());
break;
case MotionEvent.ACTION_UP:
//path.close();
Path path1=new Path(path);
paths.add(path1);
path.reset();
break;
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
flag=true;
setOnTouchListener(this);
new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag=false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
myDraw(event);
return true;
}
@Override
public void run() {
while(flag){
long start=System.currentTimeMillis();
canvas=sfh.lockCanvas();
if(canvas!=null){
canvas.drawColor(Color.BLACK);
for(int i=0;i<paths.size();i++)
canvas.drawPath(paths.get(i),paint);
canvas.drawPath(path,paint);
sfh.unlockCanvasAndPost(canvas);
}
long end=System.currentTimeMillis();
try{
if(end-start<30){
Thread.sleep(30-(end-start));
}
}
catch(Exception e){
}
}
}
}
这里还要注意的是:ArrayList保存的是对象的引用,所以要在每次添加时都新建一个对象实体。
- SurfaceView绘制触摸轨迹闪烁问题的最终解决方案
- SurfaceView绘制触摸轨迹闪烁问题的最终解决方案
- SurfaceView绘制触摸轨迹时的闪烁问题
- SurfaceView绘制触摸轨迹出现闪烁的解决方法一
- SurfaceView绘制触摸轨迹闪烁的解决方法二
- 用View绘制触摸轨迹
- SurfaceView和view分别实现触摸轨迹
- Android解决surfaceView中底图闪烁的问题。
- 动态添加SurfaceView时的闪烁问题
- SurfaceView闪烁问题的根源-双缓存机制
- 移动端transition闪烁问题的解决方案
- Android 笔记 SurfaceView实现涂鸦,轨迹重新绘制
- SurfaceView 黑背景、色差、黑闪烁问题
- SurfaceView双缓冲应用(心电图绘制),避免闪烁
- 绘制GIF图片闪烁问题!
- 图形绘制刷新闪烁问题
- C# graphics绘制闪烁问题
- MFC 绘制界面 控件以及屏幕闪烁的问题
- 黑马程序员--反射
- 使用反射特性获取类的访问权限
- [TwistedFate] NSDictionary NSSet
- 基于QML开发的二维码生成的QML插件
- React入门:关于JSX语法
- SurfaceView绘制触摸轨迹闪烁问题的最终解决方案
- 利用系统内存的一个小技巧
- Android开发&个人常见问题汇总
- 通过Spring配置JNDI数据源
- lua几点注意和脚本操作gui文件
- 接口自动化初试(一)
- Oracle中的递归总结
- 如何远程登录计算机
- 五大常用算法之一:分治算法