0 0

一個 SurfaceView 的測試,為何會將每次繪圖的畫面都保留5

以下我測試 SurfaceView 功能時寫的程式,目的是讓一個載入的圖片向右移動,執行後發現圖片有隨著執行緒不斷往右繪圖,但是每次繪圖也保留了上次繪圖的資料,不知是什麼原因造成,請問各位高手能告訴我問題在哪嗎,謝謝?

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class WalkMan extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}

class MyView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mHandler;
private MyThread mThread;

public MyView(Context context) {

super(context);
mHandler = getHolder();
mHandler.addCallback(this);
// setFocusable(true);
mThread = new MyThread();
mThread.rs =  this.getContext().getResources();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

Log.d("g", "Changed");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {

mThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

Log.d("g", "Destroyed");
mThread.finish();
}

private class MyThread extends Thread {

private boolean running;
private Canvas c;
private Paint p;
public Resources rs;
Bitmap bmp;

@Override
public void run() {

// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// }
running = true;
p = new Paint();
bmp = BitmapFactory.decodeResource(rs, R.drawable.click1);
while (running) {

draw();
// Log.d("g", String.valueOf(i++));
}
}

private void finish() {
running = false;
}

int i = 0;
private void draw() {

// Log.d("g", String.valueOf(bmp.getWidth()));

c = mHandler.lockCanvas();
c.drawBitmap(bmp, 10 + i, 10, p);
mHandler.unlockCanvasAndPost(c);
i++;
}
}
}
}
2009年10月03日 20:29

1个答案 按时间排序 按投票排序

0 0

看下文章
http://www.iteye.com/topic/420410

2009年10月12日 22:43

相关推荐

    android-SurfaceView 测试Demo

    SurfaceView支持双缓冲技术,即有两个缓冲区,一个用于绘图,一个用于显示,从而减少了画面闪烁和撕裂现象,提供了更流畅的游戏体验。 3. **SurfaceHolder接口**: SurfaceView与Surface之间的交互通过...

    多个surfaceview的切换有问题

    SurfaceView通常有一个独立的渲染线程来更新画面。如果多个SurfaceView共享同一个渲染线程,切换时必须停止旧线程,启动新线程。否则,两个SurfaceView可能会同时尝试绘制,导致混乱。正确做法是为每个SurfaceView...

    SurfaceView

    在Android平台上进行游戏开发时,SurfaceView是一个至关重要的组件,它是专门为高性能图形设计的,比如游戏、视频播放等需要连续刷新显示的应用。SurfaceView提供了一种优化的绘图机制,可以将绘制操作与应用程序的...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    surfaceView静态和动态绘图

    因此,通常会创建一个专门的渲染线程来处理绘图。 - **帧率控制**:为了保证流畅性,需要控制好每秒绘制的帧数。过高可能导致性能消耗过大,过低则可能造成动画不连贯。可以使用`System.nanoTime()`来计算间隔时间,...

    SurfaceView放大和缩小

    当你需要放大或缩小视频画面时,你需要创建一个Matrix对象,然后根据目标放大倍数调用`postScale()`方法。如果要实现局部放大,还需要计算出要放大的区域的坐标,确保只有该区域内的内容被放大。 为了将这些变换...

    surfaceview

    SurfaceView在Android开发中是一个非常重要的视图组件,它被设计用于处理高性能、低延迟的图形渲染,尤其适合游戏和视频等对实时性要求较高的应用。这个示例项目旨在展示如何在Android平台上实现高速显示功能。 ...

    双SurfaceView的使用

    本文将深入探讨如何实现“双SurfaceView”的使用,即在一个应用中同时使用两个SurfaceView,其中一个用于预览摄像头数据,另一个用于绘制图形,并且图形会根据方向传感器的变化动态旋转。 首先,我们要理解`...

    在surfaceview上放置控件

    FrameLayout是一个布局容器,它允许你在屏幕上的任意位置堆叠多个视图,可以理解为一个透明的框架,你可以将任何控件放入其中,它们会按照添加的顺序进行重叠。 以下是如何实现这个功能的详细步骤: 1. **创建...

    多个SurfaceView无法切换问题

    然而,在实际应用中,可能会遇到一个问题:当有多个SurfaceView需要切换显示时,可能会出现无法正常切换的情况。这个问题涉及到SurfaceView的工作原理和Android系统对它的管理机制。 首先,我们需要理解SurfaceView...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    最简单的surfaceview画图和截图

    - 这个文件名可能表明示例项目包含了一个浮动窗口的实现,可能使用了Android的悬浮窗权限(FLAG_ACTIVITY_FLOATING_WINDOW),并且结合了SurfaceView的功能,实现了一个浮动窗口上的动态画图和截图功能。...

    surfaceview 多点触控移动放大缩小

    当一个手指移动时,SurfaceView会跟随移动。在ACTION_MOVE事件中,如果只有一个手指在移动,可以通过计算手指的偏移量,更新SurfaceView的内容位置。 6. 实现平移和缩放 在SurfaceView中,可以创建一个Matrix对象...

    SurfaceView入门Demo

    3. **绘图线程**:SurfaceView的绘图不在主线程进行,而是需要开发者自定义一个新线程(通常称为"绘图线程")。在这个线程中,通过SurfaceHolder的`lockCanvas()`方法获取画布,然后进行绘制操作,最后调用`...

    surfaceview制作动画简单demo

    本教程将通过一个简单的动画Demo来介绍如何使用SurfaceView来实现动态效果。 首先,我们需要创建一个SurfaceView的子类,这个子类将作为动画的绘制舞台。在子类中,我们需要重写几个关键方法: 1. ` ...

    surfaceview同步绘图

    1. SurfaceView包含一个Surface对象,它在硬件层面创建了一个独立的渲染表面,与主线程分离,这样可以在后台线程中进行绘图,避免阻塞UI线程。 2. SurfaceHolder接口是与Surface交互的接口,提供了添加Callback、...

Global site tag (gtag.js) - Google Analytics