以下我測試 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++;
}
}
}
}
相关推荐
SurfaceView支持双缓冲技术,即有两个缓冲区,一个用于绘图,一个用于显示,从而减少了画面闪烁和撕裂现象,提供了更流畅的游戏体验。 3. **SurfaceHolder接口**: SurfaceView与Surface之间的交互通过...
SurfaceView通常有一个独立的渲染线程来更新画面。如果多个SurfaceView共享同一个渲染线程,切换时必须停止旧线程,启动新线程。否则,两个SurfaceView可能会同时尝试绘制,导致混乱。正确做法是为每个SurfaceView...
在Android平台上进行游戏开发时,SurfaceView是一个至关重要的组件,它是专门为高性能图形设计的,比如游戏、视频播放等需要连续刷新显示的应用。SurfaceView提供了一种优化的绘图机制,可以将绘制操作与应用程序的...
在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...
因此,通常会创建一个专门的渲染线程来处理绘图。 - **帧率控制**:为了保证流畅性,需要控制好每秒绘制的帧数。过高可能导致性能消耗过大,过低则可能造成动画不连贯。可以使用`System.nanoTime()`来计算间隔时间,...
当你需要放大或缩小视频画面时,你需要创建一个Matrix对象,然后根据目标放大倍数调用`postScale()`方法。如果要实现局部放大,还需要计算出要放大的区域的坐标,确保只有该区域内的内容被放大。 为了将这些变换...
SurfaceView在Android开发中是一个非常重要的视图组件,它被设计用于处理高性能、低延迟的图形渲染,尤其适合游戏和视频等对实时性要求较高的应用。这个示例项目旨在展示如何在Android平台上实现高速显示功能。 ...
本文将深入探讨如何实现“双SurfaceView”的使用,即在一个应用中同时使用两个SurfaceView,其中一个用于预览摄像头数据,另一个用于绘制图形,并且图形会根据方向传感器的变化动态旋转。 首先,我们要理解`...
FrameLayout是一个布局容器,它允许你在屏幕上的任意位置堆叠多个视图,可以理解为一个透明的框架,你可以将任何控件放入其中,它们会按照添加的顺序进行重叠。 以下是如何实现这个功能的详细步骤: 1. **创建...
然而,在实际应用中,可能会遇到一个问题:当有多个SurfaceView需要切换显示时,可能会出现无法正常切换的情况。这个问题涉及到SurfaceView的工作原理和Android系统对它的管理机制。 首先,我们需要理解SurfaceView...
在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...
- 这个文件名可能表明示例项目包含了一个浮动窗口的实现,可能使用了Android的悬浮窗权限(FLAG_ACTIVITY_FLOATING_WINDOW),并且结合了SurfaceView的功能,实现了一个浮动窗口上的动态画图和截图功能。...
当一个手指移动时,SurfaceView会跟随移动。在ACTION_MOVE事件中,如果只有一个手指在移动,可以通过计算手指的偏移量,更新SurfaceView的内容位置。 6. 实现平移和缩放 在SurfaceView中,可以创建一个Matrix对象...
3. **绘图线程**:SurfaceView的绘图不在主线程进行,而是需要开发者自定义一个新线程(通常称为"绘图线程")。在这个线程中,通过SurfaceHolder的`lockCanvas()`方法获取画布,然后进行绘制操作,最后调用`...
本教程将通过一个简单的动画Demo来介绍如何使用SurfaceView来实现动态效果。 首先,我们需要创建一个SurfaceView的子类,这个子类将作为动画的绘制舞台。在子类中,我们需要重写几个关键方法: 1. ` ...
1. SurfaceView包含一个Surface对象,它在硬件层面创建了一个独立的渲染表面,与主线程分离,这样可以在后台线程中进行绘图,避免阻塞UI线程。 2. SurfaceHolder接口是与Surface交互的接口,提供了添加Callback、...