编辑2a:随时可以跳到底部以获得简洁的问题。
我可以Draw a SurfaceView via xml。就我而言,我正在创建一个电子书,它将在SurfaceViews上为本书的每个页面运行不同的动画。
我的.xml
布局中FrameLayout
名为@+id/animation_layout
。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fi.harism.curl.CurlView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/curl"
>
</fi.harism.curl.CurlView>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/animation_layout"
/>
<include layout="@layout/narration"
/>
</RelativeLayout>
根据正在显示的书的哪个页面,我想在我的一组类中添加一个类的不同实例,这些类扩展为SurfaceView
。
Page01SurfaceView extends PageAniSurfaceView {
//
// code here includes onDraw() definition
//
}
Page02SurfaceView extends PageAniSurfaceView {
//
// code here includes onDraw() definition
//
}
PageAniSurfaceView基本上在实例化时创建一个Thread,并在创建View时启动该线程。
public class PageAniSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private final String TAG = this.getClass().getSimpleName();
private TutorialThread _thread;
public PageAniSurfaceView(Context context) {
super(context);
init();
}
public PageAniSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void setBackground(int bg_id)
{
// adding the callback (this) to the surface holder to intercept events
getHolder().addCallback(this);
// make the PageAniSurfaceView focusable so it can handle events
setFocusable(true);
}
protected void init()
{
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
_thread = new TutorialThread(getHolder(), this);
_thread.setRunning(true);
_thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
} catch (InterruptedException e) {
// we will try it again and again...
}
}
}
protected void draw_bitmaps(Canvas canvas)
{
// will be overridden by child classes
}
@Override
protected void onDraw(Canvas canvas) {
if(this.getVisibility() == View.VISIBLE)
{
if(canvas != null)
{
draw_bitmaps(canvas);
}
}
}
public void update_bitmaps()
{
// will be overridden by child classes
}
public void elementStarted(PageElement _pageElement) {
// Nothing in parent class
}
public void elementFinished(PageElement mElement) {
// Nothing in parent class
}
}
我有一个名为PageDisplayer
的类,它跟踪我们所在的页面,并且应该addView()
我需要为该页面包含的特定SurfaceView类。
public void displayPage()
{
page = sSystemRegistry.pageSystem.getCurrentPage();
mBookReader.mAnimationLayout.removeAllViews();
PageAniSurfaceView _ani = null;
switch(page.index)
{
case 1:
_ani = new Page01SurfaceView(mBookReader);
break;
case 2:
_ani = new Page02SurfaceView(mBookReader);
break;
case 3:
_ani = new Page03SurfaceView(mBookReader);
break;
}
if(_ani != null)
{
_ani.setWillNotDraw(false);
// mBookReader.mAnimationLayout is a FrameLayout in my .xml
mBookReader.mAnimationLayout.addView(_ani);
mElementDisplayer.setElementListener(_ani);
}
}
通过断点或LogCat,我可以告诉线程正在运行,并且正在调用onDraws。在例如Page01SurfaceView中定义和显示的位图被绘制一次,但是当update_bitmaps()改变位图的(x,y)坐标时不重绘。
为什么每次调用onDraw(Canvas)
时都没有绘制位图?
编辑:如果在位图上面有动画位图,则会显示SurfaceView上的位图。
编辑2:简洁问题:
ImageView
Z订购高于SurfaceView
是否会使SurfaceView
无法自拔?
我应该使用View而不是SurfaceView
吗?我打算尝试并报告回来。
答案 0 :(得分:0)
我只是使用View而不是SurfaceView。
Dianne Hackborn说:“表面视图非常特殊而且不是真正的视图(表面是一个Z-ordered与您自己一起排序的单独窗口),它们的Z排序与您的视图不匹配。表面视图是一个大而重的物体;您不打算以这种方式将SurfaceView视为常规视图。“
https://groups.google.com/d/topic/android-developers/COffLpanlz0/discussion