访问SurfaceView的底层图形是通过SurfaceHolder接口来实现的,通过getHolder()方法可以得到这个SurfaceHolder对象。你应该实现surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder)方法来知道在这个Surface在窗口的显示和隐藏过程中是什么时候创建和销毁的。
SurfaceView可以在多线程中被访问。
注意:一个SurfaceView只在SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed()调用之间是可用的,其他时间是得不到它的Canvas对象的(null)。
我的访问过程:
创建一个SurfaceView的子类,实现SurfaceHolder.Callback接口。
得到这个SurfaceView的SurfaceHolder对象holder。
holder.addCallback(callback),也就是实现SurfaceHolder.Callback接口的类对象。
在SurfaceHolder.Callback.surfaceCreated()调用过后holder.lockCanvas()对象就可以得到SurfaceView对象对应的Canvas对象canvas了。
用canvas对象画图。
画图结束后调用holder.unlockCanvasAndPost()就把图画在窗口中了。
SurfaceView可以多线程访问,在多线程中画图。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback {
private Context mContext;
private SurfaceHolder mHolder;
public TouchScreenAdjusterSurfaceView(Context context,) {
super(context);
mContext = context;
mHolder = TouchScreenAdjusterSurfaceView.this.getHolder();
mHolder.addCallback(TouchScreenAdjusterSurfaceView.this);
this.setFocusableInTouchMode(true); // to make sure that we can get
// touch events and key events,and
// "setFocusable()" to make sure we
// can get key events
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//now you can get the Canvas and draw something here
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
public void drawMyShape(PointPostion ps) {
mCanvas = mHolder.lockCanvas();
// draw anything you like
mHolder.unlockCanvasAndPost(mCanvas);
}
}
最近碰到以怪事,surfaceView.callback的surfaceCreated死活不能执行,不知道怎么搞,到处搜搜,把东西贴上来,慢慢研究,不知哪位高手能介绍下surfaceview回调函数的运行原理,什么时候加载,什么时候结束,郁闷,搞这个回调现在只能碰运气,烦死了
分享到:
相关推荐
SurfaceView的核心特性是它拥有自己的独立线程,这个线程称为"SurfaceHolder"回调线程,它与主线程分离,使得UI更新和图形绘制可以在不同的线程中进行,避免了因频繁更新导致的UI阻塞。这在处理密集型图形计算时尤其...
在游戏开发中,SurfaceView可以作为游戏画面的容器,通过SurfaceHolder的回调方法初始化游戏资源、处理游戏循环、绘制游戏画面。由于SurfaceView的高效渲染能力,可以保证游戏的帧率稳定,提高用户体验。 6. **与...
`SurfaceHolder`有`addCallback()`方法,可以添加一个回调对象,当`Surface`的状态发生变化时,如创建、改变或销毁时,系统会调用回调方法。在这些回调中,我们可以启动一个新的线程来处理图像数据的绘制和更新。 ...
1. **捕获Surface内容**:由于`SurfaceView`的绘制不在主线程,我们需要在Surface的回调函数`SurfaceHolder.Callback`的`surfaceChanged()`或`surfaceCreated()`中捕获绘制内容。可以创建一个`Bitmap`对象,然后使用...
6. 开始在新的SurfaceView上绘制:等待SurfaceHolder的`SurfaceCreated`回调,确保Surface已准备好,然后开始在新的Surface上进行渲染。 在这个过程中,可能会遇到的问题包括: - **Surface销毁不彻底**:如果没有...
当Surface被创建或改变时,开发者可以通过SurfaceHolder的回调函数得到通知,然后在这个新创建的Surface上进行绘制。这样可以确保游戏画面的连续性和稳定性。 4. **游戏框架构建** 使用SurfaceView构建游戏框架时...
- **在回调中绘图**:在`surfaceCreated()`回调中开始绘图,在`surfaceDestroyed()`回调中停止绘图。 5. **实例代码分析** 在"Demond_3"这个示例中,我们可能看到以下关键步骤: - 初始化SurfaceView,并设置...
4. **绘制内容**: 在 `SurfaceCreated` 回调中开始绘制,`SurfaceChanged` 回调中调整绘制参数,`SurfaceDestroyed` 回调中清理资源。 5. **线程同步**: 由于 `SurfaceView` 的绘制是在单独的线程进行,开发者需要...
2. **内存管理**:由于SurfaceView涉及到内存分配和释放,开发者需要注意内存泄漏的问题,特别是在使用SurfaceHolder的回调方法时。 3. **生命周期管理**:在Activity的onPause()和onResume()中,需要适当地停止和...
2. **获取SurfaceHolder**:SurfaceView有一个SurfaceHolder接口,用于管理Surface的状态和回调。通过调用SurfaceView的getHolder()方法获取。 3. **设置回调**:注册SurfaceHolder.Callback接口,实现其方法。`...
设置SurfaceHolder的回调,以便在Surface创建和销毁时进行相应的操作。 ```java SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder holder = surfaceView.getHolder(); holder....
注意,由于SurfaceView有自己的渲染线程,我们需要在SurfaceHolder的回调方法`surfaceChanged()`或`surfaceCreated()`中启动动画,确保Surface已经准备就绪: ```java SurfaceView surfaceView = findViewById(R....
- 这些回调方法将在主线程中执行,因此需要注意线程同步问题。 - **多线程绘图注意事项**: - 如果在单独的线程中进行绘制,则必须确保只在Surface有效的时间段内访问Surface,即在`SurfaceHolder.Callback....
在这个“android surfaceview例程”中,开发者可以深入学习到如何初始化SurfaceView,如何设置SurfaceHolder回调,如何在后台线程中进行连续绘图,以及如何处理相关的事件。通过对这个例程的分析和实践,将有助于...
9. **生命周期管理**:当Activity暂停或销毁时,Surface也会被销毁,因此在Activity的生命周期回调中正确处理SurfaceView的释放,以避免内存泄漏和异常。 10. **与硬件交互**:SurfaceView适合与硬件加速的图形库...