android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

本文分享了解决SurfaceView触摸轨迹闪烁问题的方法,供大家参考,具体内容如下

第一种解决SurfaceView触摸轨迹闪烁问题的方法:

由于SurfaceView使用双缓存机制,两张画布轮流显示到屏幕上。那么,要存储触摸轨迹并避免两张画布内容不一致造成的闪烁问题,完全可以利用保存绘制过程并不断重新绘制的方法解决闪烁,而且这样还顺带解决了多次试验中偶尔出现的因为moveTo()函数不能读取到参数执行默认设置(参数设为上次的触摸点)而出现的断线连接闪烁问题,详细代码如下:

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 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=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

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,建立Path对象,在点击时开始设置Path对象,滑动过程中记录触摸点,离开后重新设置Path对象,因不能阻塞主线程,所以新建了一个子线程来不断刷新屏幕,也就是将path不断绘制。但是,接着就出现了一个问题:屏幕中每条轨迹线的终点都会有一小段直线段不断闪烁。猜测可能是lockCanvas()获取的对象区域不一样,就试着使用了lockCanvas(Rect re),但是,运行后发现还是没有解决问题;接着想到可能是因为每次lockCanvas()后获取的对象不同,就在主线程中添加了一个Canvas对象,每次都在Canvas对象中修改画面,然后提交显示,但是,程序运行后效果丝毫没有改变!程序代码如下:

package com.tobacco.touchdraw;

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 MySurfaceView extends SurfaceView implements Callback,OnTouchListener,Runnable{

private SurfaceHolder sfh;

private Canvas canvas;

private Paint paint;

private float lastX,lastY;

private Path path;

private boolean flag;

public MySurfaceView(Context context) {

super(context);

sfh=this.getHolder();

sfh.addCallback(this);

paint=new Paint();

paint.setColor(Color.RED);

paint.setAntiAlias(true);

paint.setStrokeWidth(5);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeCap(Paint.Cap.ROUND);

path=new Path();

}

public void myDraw(MotionEvent e){

int action=e.getAction();

switch(action){

case MotionEvent.ACTION_DOWN:

path.moveTo(e.getX(),e.getY());

lastX=e.getX();

lastY=e.getY();

break;

case MotionEvent.ACTION_MOVE:

path.quadTo(lastX,lastY,e.getX(),e.getY());

lastX=e.getX();

lastY=e.getY();

break;

case MotionEvent.ACTION_UP:

//path.quadTo(lastX,lastY,e.getX(),e.getY());

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.drawPath(path,paint);

sfh.unlockCanvasAndPost(canvas);

}

long end=System.currentTimeMillis();

try{

if(end-start<100){

Thread.sleep(100-(end-start));

}

}

catch(Exception e){

}

}

}

}

以上就是本文的全部内容,希望能够帮助大家轻松解决SurfaceView触摸轨迹闪烁问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用&#xff08;包括移动应用&#xff09;的网络分析&#xff0c;一般采用将移动设备上的流量导入到PC机上&#xff0c;利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说&#xff0c;有以下三种方法&#xff1a;一、在PC上设置网络共享&#xff0c…

开端2(三)

选择行数, if (efGridResult.EFChoiceCount < 1)设为选中,,this.efGridResult[this.efGridResult.Rows.Count - 1, "check_option"] true;取数据, inInfo.SetBlockVal(this.efGridResult);弹出菜单 this.efGridResult.EFAllowMenuNew false;新增一空行 th…

利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句

不少人大概和我一样在创建物化视图的时候会犯头痛&#xff0c;怎样合理的改写SQL语句以及添加物化视图日志需要经过慎重精密的考虑。有了DBMS_ADVISOR.TUNE_MVIEW存储过程这个帮手后&#xff0c;极大地方便了DBA或应用设计人员创建和优化物化视图。该TUNE_MVIEW存储过程可以做到…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题&#xff08;金融事业部&#xff09;1&#xff09;技术基础题&#xff08;共十题&#xff0c;每题5分&#xff09;&#xff08;1&#xff09;列举在Linux系统下可以在看系统各项性能的工具&#xff08;区分CPU、内存、硬盘、网络等&#xff09;…

android 搜狗地图包名,搜狗地图(免费语音导航)

权限信息 读取您的USB存储设备中的内容 android.permission.REQUEST_INSTALL_PACKAComGES android.permission.RECEIVE_USER_PRESENT 完全的网络访问权限 android.permission.ACCESS_BACKGROUND_LOCATION 大致位置(基于网络) 精确位置(基于GPS和网络) 查看网络连接 修改或删除您…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线&#xff0c;会看到&#xff0c;安装不成功时会有个“&#xff01;” 双击它&#xff0c;出现 点击“属性”&#xff0c;出现 点击“改变设置”&#xff0c;出现 点击“更新驱动程序”&#xff0c;出现 点击进去&#xff0c…

ora-00054:resource busy and acquire with nowait specified解决方法

当某个数据库用户在数据库中插入、更新、删除一个表的数据&#xff0c;或者增加一个表的主键时或者表的索引时&#xff0c;常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行&#xff08;或者事务已经被锁&#xff09…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里&#xff0c;周星驰饰演的尹天仇&#xff0c;是一个渴望成为真正的演员&#xff0c;却不断沦为落魄跑龙套的小人物。即便如此&#xff0c;他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会&#xff0c;还在街坊福利社开了个戏剧训练班&#xf…

android常用控件实验报告,ui设计实验报告.doc

ui设计实验报告ui设计实验报告篇一&#xff1a;UI设计实验报告实验项目四&#xff1a;UI设计一、 实验目的和要求1、熟练运用Eclipse软件中的swing设计。2、掌握UI编写的软件。3、能都熟练的进行操作&#xff0c;理解每个按钮的含义并懂得修改参数。4、理解其幕后的Java代码。二…

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统

星期三&#xff0c;今天早上上了四节JS课程&#xff0c;下午听健康讲座&#xff0c;晚上装系统。我想说装系统是最浪费时间的&#xff0c;以前大一的时候&#xff0c;有一段时间喜欢上装系统&#xff0c;我去有时候一个系统装了两三天&#xff0c;因为有很多问题。 ~ 后面就不研…

在欲而无欲,居尘不染尘

僧人竺法深在东晋简文帝处作客&#xff0c;刘尹问&#xff1a;「法师是学道之人&#xff0c;为什么要来官宦之门中走动&#xff1f;」竺法深回答说&#xff1a;「你自见这是朱门高第&#xff0c;在贫道眼里&#xff0c;同走在茅屋草舍间并无任何差别。」   法师的境界&#x…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题&#xff0c;在同样的样式&#xff08;主要是宽高边距之类的&#xff09;条件下&#xff0c;DIV在移动端和PC端的宽度不一样&#xff0c;排除了绝大多数样式的问题&#xff0c;但是有个比较陌生&#xff0c;就是box-sizing&#xff0c;其实经常看到&…

C# 遍历List 并删除某个元素

1、我们选择用for循环&#xff0c; for(int i0;i { if(list[i]) { list.RemoveAt(i); } } 如果这样循环&#xff0c;肯定不对&#xff0c; {A B C D E F G H} 假设当前遍历到D&#xff08;i3&#xff09;,移除&#xff0c;接着遍历i4(F), 此时跳过了E&#xff08;i3&a…

android studio不能更新代码,解决Android Studio 和 Android SDK Manager 无法在线更新的问题....

升级时提示 Connection failed. Please check your network connection and try again修改安装目录下bin\studio.exe.vmoptions文件,如E:\Android\android-studio\bin\studio.exe.vmoptions添加内容:-Djava.net.preferIPv4Stacktrue-Didea.updates.urlhttp://dl.google.com/and…

我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)

shelve模块shelve模块是pickle模块的扩展&#xff0c;可以通过key&#xff0c;value的方式访问pickle持久化保存的数据持久化保存&#xff1a;12345678910111213import shelvesw shelve.open(shelve_test.pkl) # 创建shelve对象name [13, 14, 145, 6] # 创建一个列表dist_tes…

NH3.X与2.X使用上的一些区别

NH用了很长时间一直都是用2.X版本&#xff0c;今天体验了一下3.3。记录一下两者使用上的一些区别。 一、代理 //2.x 写法 <property nameproxyfactory.factory_class>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>//3.X…

(转)DirectShow9在VS2005或vc6.0下编译出现问题的解决方法

1。我用的版本是DirectX9.0b &#xff0c;没有安装&#xff0c;直接解压后放到一个文件夹里用 2。我按照以下的步骤操作成功。明天试着做个播放器。 VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包;DirectShow是微软公司在VFW的基础上推出的新一代基于C…

apache 设置404 页面_SpringBoot自定义错误页面

SpringBoot请求错误如404可能看到如下页面&#xff1a;有时可能需要自定义错误页面针对不同的http.status,如404/400。【1】解决方法① 注册错误页面如下所示&#xff1a;Componentpublic class ErrorPageConfig implements ErrorPageRegistrar { Override public void r…

ios android cpu占用率,iPhone-iOS-从应用程序获取CPU使用率

iPhone-iOS-从应用程序获取CPU使用率有谁知道如何获取应用程序的CPU使用率&#xff1f; 绝对有可能&#xff0c;因为应用商店中有一些可以显示它的应用程序(活动监视器触摸)。3个解决方案74 votes更新。 这段代码为我工作&#xff1a;更新2。thread_list泄漏&#xff0c;因此添…