`
tobacco5648
  • 浏览: 2088 次
社区版块
存档分类
最新评论

Android中SurfaceView绘制触摸轨迹时出现的闪烁问题

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

相关推荐

    解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

    解决SurfaceView触摸轨迹闪烁问题的方法通常有两种: 1. **利用双缓冲机制**: 双缓冲技术是解决闪烁问题的常见方法。我们可以在内存中创建两个Canvas,一个用于绘制新的触摸轨迹,另一个用于显示。当一个Canvas...

    android surfaceview自定义拍照 绘制头像轮廓

    在Android中,可以使用OpenCV库或者其他图像处理库来处理这一部分。例如,OpenCV提供了Canny边缘检测算法,可以找出图像中的边界。首先,将拍照得到的图像转换为灰度图像,然后应用Canny算法找到图像的边缘。找到...

    Android中SurfaceView截屏

    本文将详细介绍如何在Android中实现`SurfaceView`的截屏功能。 首先,了解`SurfaceView`的基本原理。`SurfaceView`创建了一个独立的窗口,并在自己的Surface上绘制内容。这使得它可以在后台线程进行高效的绘制,但...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    surfaceView实现手写板重播绘制轨迹,保存为Bitmap

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理高性能图形和视频渲染时。本项目是利用`SurfaceView`实现了一个手写板功能,它不仅提供了流畅的绘画体验,还具备轨迹重播和保存为Bitmap的能力...

    Android中SurfaceView的使用

    7. **与TextureView的比较**:TextureView也是Android中用于高性能图形的一个组件,它提供了一种将OpenGL ES纹理作为View的方式。与SurfaceView相比,TextureView可以进行更灵活的布局和透明度设置,但其渲染线程...

    android之surfaceview游戏开发

    在Android中,SurfaceView内部维护了前后两帧缓冲,这样在绘制新帧时,可以避免闪烁现象。当一帧绘制完成后,SurfaceView会自动交换缓冲区,显示新绘制的内容,而旧的帧则会被丢弃或重用。 为了提高性能,开发者还...

    使用android自带的动画机制很卡时可以考虑使用SurfaceView来实现动画

    在Android应用开发中,我们经常会遇到需要创建流畅的动画效果,但有时使用默认的动画机制(如`ViewPropertyAnimator`、`ObjectAnimator`等)可能会出现性能问题,尤其是在处理大量图形变化或者游戏场景时。...

    Android SurfaceView绘制组合图形

    总结来说,`SurfaceView`是Android平台用于高效绘制动态内容的重要工具,通过创建子类,利用`SurfaceHolder`回调,以及在独立线程中进行绘制,我们可以实现复杂的组合图形以及流畅的动画效果。理解并熟练运用这些...

    Android圆形相机预览窗口,圆形SurfaceView

    在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。`SurfaceView`通常用于处理高性能的图形或者视频播放,因为它可以在单独的线程中进行...

    DrawImage SurfaceView 多层绘制透明图

    在Android中,每个像素都有一个alpha通道,表示像素的透明度,0代表完全透明,255代表完全不透明。我们可以使用`Bitmap.createBitmap()`方法创建带有alpha通道的`Bitmap`,或者在`Paint`对象中设置`setAlpha()`来...

    Android 通过SurfaceView 实现实时显示摄像头视频

    总之,通过SurfaceView实现实时显示摄像头视频是Android开发中的一个基础任务,涉及到对Android系统相机API的理解和使用,以及对SurfaceView生命周期的掌握。随着技术的发展,开发者可以选择更高级的API,如Camera2...

    用path和surfaceview绘制一些有意思的玩意

    在Android开发中,`Path`和`SurfaceView`是两个重要的组件,它们分别用于图形绘制和高性能的视频或游戏画面渲染。在这个项目中,开发者尝试利用它们来创建一个有趣的八边形并可能添加一些文字或其他图形元素。让我们...

    android之surfaceview学习示例

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形渲染的能力。SurfaceView的设计初衷是为了处理那些需要频繁更新且对性能要求较高的场景,如视频播放、游戏画面...

    Android中TextureView与SurfaceView用法区别总结

    SurfaceView和TextureView均继承于android.view.View 与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。 一、SurfaceView专门提供了嵌入视图层级的绘制界面,开发者...

    android中surfaceview控件的使用范例

    总结,SurfaceView是Android中用于高性能图形绘制的重要组件,它的核心在于能够独立于主线程进行绘图,提高应用程序的响应速度。掌握SurfaceView的使用和优化技巧,对于开发游戏、视频播放等需要高效渲染的应用至关...

    SurfaceView实现图片缩放,移动加标记

    接下来,我们来看看如何在Android中实现邮件的发送。Android提供了`Intent`机制,可以方便地启动系统内置的邮件应用来发送邮件。创建一个`Intent`,设置动作为`ACTION_SENDTO`,然后添加邮件的相关信息,如收件人、...

    android-SurfaceView 测试Demo

    在Android平台上,SurfaceView是一种特殊的View,用于处理高性能、低延迟的图形绘制,尤其是在开发游戏或者视频播放等需要高效刷新率的应用时。本测试Demo旨在展示如何有效地利用SurfaceView进行游戏开发。以下是对...

Global site tag (gtag.js) - Google Analytics