Android: обновить пользовательский вид поверхности между двумя состояниями - PullRequest
0 голосов
/ 11 октября 2011

У меня есть пользовательский SurfaceView, определенный в моем макете XML. Я не могу нарисовать на холсте никаких проблем со связанным внешним классом, который расширил SurfaceView. Однако моя цель состоит в том, чтобы нарисовать начальное состояние (давайте назовем его состоянием 0) на холсте, который представляет собой некоторый текст с белым фоном, и после некоторого события, такого как нажатие кнопки, рисуется изображение (давайте назовем его состоянием 1) на тот же холст. По отдельности я могу нарисовать оба этих состояния на одном и том же холсте, однако у меня возникают трудности при изменении состояния холста при возникновении события.

Возможно, существует другой способ сделать это, возможно, создать наложенный вид сверху и программно вызвать его при нажатии кнопки.

Вот мои данные: 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 Ответ

1 голос
/ 11 октября 2011

Попробуйте mplement thread, чтобы нарисовать вещи на холсте, как в этом уроке.Это может решить вашу проблему.

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

...