2011-10-11 75 views
0

我在我的布局xml中定义了自定义SurfaceView。我可以画到画布没有扩展SurfaceView的关联外部类的问题。然而,我的目标是绘制一个初始状态(让它的状态为0)到画布上,这是一些带有白色背景的文字,并且在按下某个事件(例如按下按钮)之后,绘制图像(让它称为状态1)同一幅画布。另外,我可以将这两种状态都绘制到同一个画布上,但是当发生事件时,我很难更改画布的状态。Android:在两个状态之间更新自定义Surfaceview画布

也可能有另一种方法来做到这一点,也许在顶部创建一个覆盖视图,并在按钮上按编程方式调用它。

这里是我的细节:XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:background="#FFFFFFFF" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

    <TextView android:layout_height="wrap_content" 
    android:layout_marginLeft= "5dp" 
    android:layout_marginTop = "5dp" 
    android:layout_marginBottom = "5dp" 
    android:id="@+id/textNoisy" 
    android:layout_width="fill_parent" 
    android:text="@string/TextNoisy" 
    android:textColor="#161616"></TextView> 

<com.speechenhancer.SpecGuageNoisy 
    android:id="@+id/SpecGuageNoisy" 
    android:layout_width="fill_parent" 
    android:layout_height="220dp" 
    android:layout_below="@+id/textNoisy"/> 

<TextView android:layout_height="wrap_content" 
    android:layout_marginLeft= "5dp" 
    android:layout_marginBottom = "5dp" 
    android:id="@+id/textEnhanced" 
    android:layout_below="@+id/SpecGuageNoisy" 
    android:layout_width="wrap_content" 
    android:text="@string/TextEnhanced" 
    android:textColor="#161616"></TextView> 


<Button android:id="@+id/ButtonEnhance" 
    android:layout_marginTop = "20dp" 
    android:layout_width="140dp" 
    android:layout_height="wrap_content" 
    android:text="@string/ButtonEnhance" 
    android:layout_alignParentBottom="true" 
    android:layout_gravity="center" ></Button> 

主要活动

public class SpecGuageNoisy extends SurfaceView implements SurfaceHolder.Callback { 


public SpecGuageNoisy(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 


    holder = getHolder(); 
    holder.addCallback(this); 

} 
    @Override 
public void surfaceChanged(SurfaceHolder holder, int format, 
     int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    if (SpecState.getCanvasState()==0){ 
     // Draw Initial state 
    }else if (SpecState.getCanvasState()==1){ 
    spectrum = init(); 
    canvas = getHolder().lockCanvas(); 
    canvas.drawColor(Color.WHITE); 
    onDraw(canvas,spectrum, nsegs, seglen,nshift); 
    getHolder().unlockCanvasAndPost(canvas); 
    } 
} 

自定义SurfaceView:

public class SpecGuageNoisy extends SurfaceView implements SurfaceHolder.Callback { 


public SpecGuageNoisy(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 


    holder = getHolder(); 
    holder.addCallback(this); 

} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, 
     int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    if (SpecState.getCanvasState()==0){ 
     // Draw Initial state 
    }else if (SpecState.getCanvasState()==1){ 
    spectrum = init(); 
    canvas = getHolder().lockCanvas(); 
    canvas.drawColor(Color.WHITE); 
    onDraw(canvas,spectrum, nsegs, seglen,nshift); 
    getHolder().unlockCanvasAndPost(canvas); 
    } 
} 
    } 

在这段代码中我没有表现出拉丝状态0也没有尝试设置Onlick侦听器到ButtonEnhance。我还没有显示onDraw函数,因为它运行良好。我刚把它粘贴在这里来说明我的设置。我没有收到任何报告logcat信息的错误。更重要的是,我需要一些帮助来制定如何实现这种特殊情况。有任何想法吗?谢谢

回答

1

尝试使用mplement线程在画布上绘制东西,就像本教程中的内容。它可能会解决你的问题。

http://www.droidnova.com/playing-with-graphics-in-android-part-iii,176.html

+0

奇怪你会提到它,因为我已经从一个多线程的方式转换回线性的方法,因为我认为这可能是更容易。我已经实现了与该链接的着陆页上的内容类似的内容,但仍然存在相同的问题。无法在两种状态之间转换。 – digiphd

+0

指向教程的链接已损坏 – Ravi