Как запустить вид поверхности, определенный в формате xml, нажатием кнопки? - PullRequest
0 голосов
/ 07 апреля 2011

Я создал свой исходный код из другого учебника, чтобы создать классы для обработки рисунков в SurfaceView. Этот урок (и другие, которые я обнаружил) связывает определенный SurfaceView xml с классом, который инициируется при создании действия. Моя цель - запускать анимацию в виде поверхности, заданном в формате xml, после нажатия кнопки в макете и прекращения ее при повторном нажатии.

Кроме того, анимация должна запускаться в области, указанной в моем xml (а не во всем отображении).

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

Итак, когда я нажимаю кнопку «Перейти» (BattleActivity :: onClick), мой вид поверхности создается и рисуется, но он заполняет весь экран, покрывая другие элементы управления в моем макете, включая кнопку. Я хочу, чтобы анимация происходила только в виде поверхности, определенном как часть моего макета (id = battleView).

Вот подраздел моего кода макета XML (tabBattle.xml).

<LinearLayout
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SurfaceView
        android:id="@+id/battleView"
        android:layout_weight="70"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"/>        

    <Button
        android:onClick="onClick"
        android:text=" Go "
        android:gravity="center"
        android:layout_weight="30"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Вот мой основной класс деятельности. Это создается, когда я перехожу к представлению вкладок, где находится его макет (tabBattle). OnClick вызывается, когда я нажимаю кнопку Go. Мое намерение в onClick - получить вид поверхности, создать новый экземпляр BattleView и передать контекст вида поверхности конструктору BattleView. Это явно не правильно, но я понятия не имею, как еще это сделать.

открытый класс BattleActivity расширяет Activity реализует View.OnClickListener { @Override public void onCreate (BundlevedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.tabbattle); }

@Override
public void onClick(View v)
{
    SurfaceView battleSurface = (SurfaceView)findViewById(R.id.battleView);
    setContentView(new BattleView( battleSurface.getContext() ));
}

}

Подкласс SurfaceView:

открытый класс BattleView расширяет SurfaceView, реализует SurfaceHolder.Callback { частный int circleRadius; частный круг покраскиPaint; UpdateThreadBattle updateThread;

private int width;
private int height;
private int xPos;
private int yPos;
private int xVel;
private int yVel;

public BattleView(Context context)
{
    super(context);
    getHolder().addCallback(this);

    circleRadius = 10;
    circlePaint = new Paint();
    circlePaint.setColor(Color.BLUE);

    xVel = 2;
    yVel = 2;       
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);
}


@Override
public void surfaceCreated(SurfaceHolder holder)
{
    Rect surfaceFrame = holder.getSurfaceFrame();
    width = surfaceFrame.width();
    height = surfaceFrame.height();

    xPos = width / 2;
    yPos = circleRadius;

    updateThread = new UpdateThreadBattle(this);
    updateThread.setRunning(true);
    updateThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0)
{
    boolean retry = true;

    updateThread.setRunning(false);

    while (retry) {
        try {
            updateThread.join();
            retry = false;
        } catch (InterruptedException e) {

        }
    }
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

}

Как вы, вероятно, подозревали, я новичок в Android и Java в целом. Любая помощь с благодарностью!

Грег

1 Ответ

0 голосов
/ 18 апреля 2011

Возможное решение, которое я выбрал, состояло в том, чтобы использовать таймер, а не реализовывать поверхностную анимацию на основе потоков, которая была излишней для простой анимации, которую я требовал в представлении. В то время, когда я писал вопрос, я не знал о таймере. Отлично работает, брв!

...